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>

有人能帮我吗?

165592 次浏览

当我尝试运行它时,会得到 NoClassDefFoundError

怎么查?您可能试图在没有正确导入 maven 类路径的情况下使用 eclipse 运行它。请参阅 日食插件,了解如何将 maven 与 eclipse 集成在一起。

为了验证你的 maven 配置是否正确,你可以使用 执行插件来运行你的应用:

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。包含罐子的目录不起作用。有关构建类路径的详细信息,请参阅“ 设置类路径”以及 爪哇咖啡Javac工具文档。

你的类路径至少应该是这样的,而且没有换行符:

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 上的分隔符是分号(;)。

很抱歉我没有早点注意到这个问题。问题就在你原来的帖子里,但是我错过了。

默认情况下,Maven 不会在其构建的 JAR 文件中绑定依赖项,并且当您试图在命令行上执行 JAR 文件时,也不会在类路径中提供这些依赖项。这就是为什么 JavaVM 在尝试执行代码时找不到库类文件的原因。

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

更好的解决方案是将库代码“遮蔽”到输出 JAR 文件中。有一个名为 文明-阴影-插件的 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,为可执行 JAR 文件指定 Main-Class,等等,请参阅 Maven-shadow-plugin 站点中的“示例”部分。

选择 Project-> Clean 可以解决这个问题

这是由于 Morphia 不是输出 war/jar 的一部分。Eclipse 或本地构建将它们作为类路径的一部分,但远程构建或自动/计划构建并不认为它们是类路径的一部分。

您可以使用插件包含依赖的 jar。

将下面的代码片段添加到您的 POM 的插件部分

    <plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>

我可以通过运行 mvn install: install-file with-Dpack = class 来解决这个问题。然后向 POM 添加条目,如 给你所述:

由于某种原因,lib 是 在编译时呈现,但是 逃跑时失踪

我的情况是,一个自由主义冲突的两个版本。

例如,A 依赖于 B 和 C,而 B 依赖于 D: 1.0,C 依赖于 D: 1.1,maven may 只要进口 D: 1.0。如果 A 使用 D: 1.1而不是 D: 1.0中的一个类,则会抛出 NoClassDefFoundError。

如果您也处于这种情况,则需要解决依赖关系冲突。