Maven 依赖项上的 NoClassDefFoundError

新手上路,请多包涵

我第一次使用 Maven 时遇到了依赖问题。

我用 Eclipse 创建了一个 Maven 项目并添加了依赖项,它运行没有问题。

但是当我尝试通过命令行运行它时:

 $ mvn package  # successfully completes
$ java -cp target/bil138_4-0.0.1-SNAPSHOT.jar tr.edu.hacettepe.cs.b21127113.bil138_4.App # NoClassDefFoundError for dependencies

它下载依赖项,成功构建,但是当我尝试运行它时,我得到 NoClassDefFoundError:

 Exception in thread "main" java.lang.NoClassDefFoundError: org/codehaus/jackson/JsonParseException
        at tr.edu.hacettepe.cs.b21127113.bil138_4.db.DatabaseManager.<init>(DatabaseManager.java:16)
        at tr.edu.hacettepe.cs.b21127113.bil138_4.db.DatabaseManager.<init>(DatabaseManager.java:22)
        at tr.edu.hacettepe.cs.b21127113.bil138_4.App.main(App.java:10)
Caused by: java.lang.ClassNotFoundException: org.codehaus.jackson.JsonParseException
        at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
        ... 3 more

我的 pom.xml 是这样的:

 <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>tr.edu.hacettepe.cs.b21127113</groupId>
  <artifactId>bil138_4</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>bil138_4</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-core-asl</artifactId>
    </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
        </dependency>
  </dependencies>
  <dependencyManagement>
    <dependencies>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>1.9.6</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.6</version>
    </dependency>
    </dependencies>
  </dependencyManagement>
</project>

谁能帮我?

原文由 utdemir 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

当我尝试运行它时,出现 NoClassDefFoundError

怎么运行?您可能试图在没有正确导入 Maven 类路径的情况下使用 eclipse 运行它。请参阅用于将 maven 与 eclipse 集成的 m2eclipse 插件。

要验证您的 Maven 配置是否正确,您可以使用 exec 插件 运行您的应用程序:

 mvn exec:java -D exec.mainClass=<your main class>

更新: 首先,关于运行时的错误 exec:java ,你的主类是 tr.edu.hacettepe.cs.b21127113.bil138_4.App 。在谈论类名时,它们(几乎)总是以点分隔。简单的类名只是最后一部分: App 在你的例子中。完全限定名称是完整的包加上简单的类名,当你想运行某些东西时,它就是你给 maven 或 java 的名称。您尝试使用的是源文件的文件系统路径。那是完全不同的野兽。与文件系统中的源文件相比,类名通常直接转换为在类路径中找到的类文件。在您的特定情况下,有问题的类文件可能位于 target/classes/tr/edu/hacettepe/cs/b21127113/bil138_4/App.class 因为 Maven 编译为 target/classes ,而 java 传统上为每个级别的包装创建一个目录。

您最初的问题只是您没有将 Jackson 罐子放在您的课程路径上。当你从命令行运行一个 java 程序时,你必须设置类路径让它知道它可以从哪里加载类。您已经添加了自己的 jar,但没有添加其他必需的。您的评论让我觉得您不了解如何手动构建类路径。简而言之,类路径可以有两个东西:包含类文件的目录和包含类文件的 jar。包含 jars 的目录将不起作用。有关构建类路径的更多详细信息,请参阅“ 设置类路径”以及 javajavac 工具文档。

您的类路径至少需要是,并且没有换行符:

 target/bil138_4-0.0.1-SNAPSHOT.jar:
/home/utdemir/.m2/repository/org/codehaus/jackson/jackson-core-asl/1.9.6/jackson-core-asl-1.9.6.jar:
/home/utdemir/.m2/repository/org/codehaus/jackson/jackson-mapper-asl/1.9.6/jackson-mapper-asl-1.9.6.jar

请注意,Windows 上的分隔符是分号 (;)。

我很抱歉没有早点注意到它。问题出在您的原始帖子中,但我错过了。

原文由 Ryan Stewart 发布,翻译遵循 CC BY-SA 3.0 许可协议

默认情况下,Maven 不会在它构建的 JAR 文件中捆绑依赖项,并且当您尝试在命令行中执行 JAR 文件时,您也不会在类路径中提供它们。这就是 Java VM 在尝试执行您的代码时找不到库类文件的原因。

您可以使用 -cp 参数手动指定类路径上的库,但这很快就会变得令人厌烦。

更好的解决方案是将库代码“隐藏”到输出 JAR 文件中。有一个名为 maven-shade-plugin 的 Maven 插件可以执行此操作。您需要在 POM 中注册它,当您运行 mvn package 时,它会自动构建一个包含您的类和库代码类的“uber-JAR”。

要简单地捆绑所有必需的库,请将以下内容添加到您的 POM:

 <project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.4.1</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

完成后,您可以重新运行上面使用的命令:

 $ mvn package
$ java -cp target/bil138_4-0.0.1-SNAPSHOT.jar tr.edu.hacettepe.cs.b21127113.bil138_4.App

如果您想根据应包含的 JAR 对 shade 插件进行进一步配置,为可执行 JAR 文件指定 Main-Class 等,请参阅 maven-shade-plugin 站点 上的“示例”部分。

原文由 Matt Ryall 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏