Java 当我在VSCode中运行时,程序运行正常,但是maven扩展构建的包不';跑不动

Java 当我在VSCode中运行时,程序运行正常,但是maven扩展构建的包不';跑不动,java,maven,visual-studio-code,executable-jar,htmlunit,Java,Maven,Visual Studio Code,Executable Jar,Htmlunit,背景:我正在使用VS代码和VS代码Java扩展包(包括一个maven扩展)编写一个使用htmlunit的项目。目前,我只是在使用其他人的代码,看看是否可以让我的环境正常工作。我完全是maven和VS代码的noob,是Java的半noob 当我使用VS代码运行选项卡运行程序时,它会按预期运行*。当我使用maven package命令构建一个可执行jar时,jar构建得很好,但是当我使用java-jar\uuuu\uu.jar运行它时,我得到一个错误: Exception in thread &qu

背景:我正在使用VS代码和VS代码Java扩展包(包括一个maven扩展)编写一个使用htmlunit的项目。目前,我只是在使用其他人的代码,看看是否可以让我的环境正常工作。我完全是maven和VS代码的noob,是Java的半noob

当我使用VS代码运行选项卡运行程序时,它会按预期运行*。当我使用maven package命令构建一个可执行jar时,jar构建得很好,但是当我使用
java-jar\uuuu\uu.jar
运行它时,我得到一个错误:

Exception in thread "main" java.lang.NoClassDefFoundError: com/gargoylesoftware/htmlunit/FailingHttpStatusCodeException
        at reliant.Main.main(Main.java:44)
Caused by: java.lang.ClassNotFoundException: com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        ... 1 more 
以下是使用htmlunit的代码:

package reliant; //I know now this is not how package naming conventions work, but I don't think it causes a problem
import java.io.IOException;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; //the import that seems to be buggy
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class RedditClient {
    
    private final WebClient CLIENT = new WebClient(BrowserVersion.CHROME);
    private final String username;
    private char[] password;

    public RedditClient(String username, char[] password) {
        this.username = username;
        this.password = password;
     
        CLIENT.getCookieManager().setCookiesEnabled(true);
    }

    public void checkLogin() {
        System.out.println(username + ", " + new String(password));
    }

    public void login() {
        String loginURL = "https://www.reddit.com/login";

        try {
            HtmlPage loginPage = CLIENT.getPage(loginURL);

            HtmlForm loginForm = loginPage.getFirstByXPath("//form[@id='login-form']");
            //System.out.println(loginPage.getWebResponse().getContentAsString());
            loginForm.getInputByName("user").setValueAttribute(username);
            loginForm.getInputByName("passwd").setValueAttribute(new String(password));

            loginForm.getElementsByTagName("button").get(0).click();

        } catch (FailingHttpStatusCodeException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }

    public String getHTML(String url) {
        try {
            return CLIENT.getPage(url).getWebResponse().getContentAsString();
        } catch (FailingHttpStatusCodeException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    public void close() {
        CLIENT.close();
    }
}
下面是Main.java的第44行:

RedditClient c = new RedditClient(username, password);
在我看来,这似乎是正确的,我将htmlunit添加到了我的maven依赖项中。如果您愿意的话,我可以向您展示一个maven依赖项的尖叫,但我现在省略了它,因为它有点长/难读

以下是pom文件:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>reliant</groupId>
  <artifactId>redditlogin</artifactId>
  <version>2.0</version>

  <name>redditlogin</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>

  <dependencies>

    <dependency>
      <groupId>htmlunit</groupId>
      <artifactId>htmlunit</artifactId>
      <version>1.14</version>
    </dependency>


   <dependency>
     <groupId>org.jsoup</groupId>
     <artifactId>jsoup</artifactId>
     <version>1.13.1</version>
   </dependency>


    <dependency>
      <groupId>net.sourceforge.htmlunit</groupId>
      <artifactId>htmlunit</artifactId>
      <version>2.41.0</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
          <configuration>
            <archive>
              <manifest>
                <addClasspath>true</addClasspath>
                  <mainClass>reliant.Main</mainClass>
              </manifest>
            </archive>
          </configuration>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

4.0.0
依靠的
红地洛金
2
红地洛金
http://www.example.com
UTF-8
11
11
htmlunit
htmlunit
1.14
org.jsoup
jsoup
1.13.1
net.sourceforge.htmlunit
htmlunit
2.41.0
朱尼特
朱尼特
4.11
测试
maven清洁插件
3.1.0
maven资源插件
3.0.2
maven编译器插件
3.8.0
maven surefire插件
2.22.1
maven jar插件
3.0.2
真的
可靠的,主要的
maven安装插件
2.5.2
maven部署插件
2.8.2
maven站点插件
3.7.1
maven项目信息报告插件
3.0.0
jar文件出错,但在VS代码中运行,这一事实对我来说毫无意义

另外,另一个不相关的注意事项是,为什么“未找到类”错误是运行时错误?为什么maven能够成功构建包

*我之所以说“如预期的那样”,是因为我正在使用的代码中有一个bug,但这是一个非常具体的运行时错误。基本上,我使用的代码是为了在reddit获得OAuth之前登录reddit而设计的,所以现在尝试获取登录表单的行返回null,这会中断其余部分。关键是,我看不出为什么在VS代码中运行和运行jar会有任何不同的结果。我甚至不知道从哪里开始这样的事情


谢谢您的帮助,请告诉我是否有什么我可以补充的,以使这个问题更容易回答。

好的,所以这是非常愚蠢的。基本上,类路径列出了我的依赖项(因为我是如何设置pom的),但这并不意味着它指定了这些依赖项的路径。事实上,它根本没有指定路径,所以每当java试图运行jar时,它都会在当前目录中查找依赖项。我知道这一点,因为当我将依赖项放在与jar相同的目录中时,它就起作用了。这里更好的解决方案是修改pom,向类路径添加前缀,以便java知道在哪里找到依赖项。不幸的是,我的依赖关系在不同的地方,所以这不是我真正的选择;相反,我将尝试找出如何制作胖罐子。

我认为问题可能与我没有生成胖罐子这一事实有关。有人知道如何在vscode中做到这一点吗?这不是一个更好的解决方案,因为完整路径是特定于您的计算机的,Java程序是可移植的。我明白了,你的肥罐溶液好多了。出于好奇,您不能指定一个相对路径吗?我看到的一些示例(,)似乎使用了相对路径前缀,如“dependency jars/”或“lib/”。是的,但该路径是相对于主jar(即您正在执行的jar)的,如果您的最终结果是一个程序集(一个包含jar以及所有依赖项的存档),则应该使用该路径。您可以指示maven为您创建一个依赖项,并指定这些依赖项必须放在相对于jar的某个文件夹中。有关使用Maven创建程序集的详细信息,请参见: