Maven依赖项上的NoClassDefFoundError

我第一次使用Maven和我坚持依赖。

我用Eclipse创build了一个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 

它下载依赖关系,成功构build,但是当我尝试运行它,我得到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> 

谁能帮我?

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

运行它如何? 你可能试图在没有正确导入你的Maven类path的情况下使用eclipse来运行它。 请参阅m2eclipse插件来将Maven与Eclipse进行整合。

要validation您的mavenconfiguration是否正确,您可以使用exec插件运行您的应用程序:

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

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

你原来的问题只是你没有把jackson的jar子放在你的课堂path上。 当你从命令行运行一个java程序时,你必须设置类path,让它知道它可以从哪里加载类。 你已经添加了你自己的jar,但没有其他必需的。 您的评论让我觉得你不明白如何手动build立一个类path。 总之,类path可以有两个东西:包含类文件的目录和包含类文件的jar子。 含有jar子的目录将不起作用。 有关构build类path的更多详细信息,请参阅“ 设置类path ”以及java和javac工具文档。

您的课程path至less需要,并且没有换行符:

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

我很抱歉没有注意到它。 问题是坐在你原来的post,但我错过了。

默认情况下,Maven不会将它所依赖的JAR文件捆绑在一起,而当您尝试在命令行上执行JAR文件时,您不会在类path中提供它们。 这就是为什么Java VM在尝试执行代码时找不到库类文件的原因。

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

更好的解决scheme是将库代码“遮蔽”到输出JAR文件中。 有一个名为maven-shade-plugin的Maven插件可以做到这一点。 你需要在你的POM中注册它,当你运行mvn package时候,它也会自动build立一个包含你的类和类库的“uber-JAR”。

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

 <project> ... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>1.6</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进行阴影插件的进一步configuration,指定可执行JAR文件的Main-Class等,请参阅maven-shade-plugin站点上的“示例”部分。

您必须在pom文件中创build类path以获得您的依赖。 因此你必须把所有的依赖关系复制到一个地方。

检查我的博客。 http://madhawagunasekara.blogspot.com/2014/10/solving-javalangnoclassdeffounderror-in.html

 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.1</version> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputdirectory>${project.build.directory}/lib</outputdirectory> <overwritereleases>false</overwritereleases> <overwritesnapshots>false</overwritesnapshots> <overwriteifnewer>true</overwriteifnewer> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>$fullqualified path to your main Class</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> 

这是由于Morphia jar不是你的输出war / jar的一部分。 Eclipse或本地构build将它们作为类path的一部分,但远程构build或自动/计划构build不会将它们视为类path的一部分。

你可以使用插件包括依赖的jar子。

将下面的代码片段添加到你的pom的插件部分

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

select项目 – >清洁应该解决这个问题