又一个NoClassDefFoundError难题

时间:2012-11-19 22:12:59

标签: java noclassdeffounderror

我创建了两个jar文件my.common.jar,其中包含帮助程序类和方法(主要是静态方法)。我还使用main方法创建了一个jar文件test.jar,该方法在my.common.jar中的类中调用静态方法。

当我像这样启动main时,一切正常:

java -classpath path/to/myjars/my.common.jar:./test.jar test.Tester

Tester是test.jar中包含方法main的类。

但是当我以这种方式运行时,我得到NoClassDefFoundError my/common/Myclass

java -classpath path/to/myjars/my.common.jar -jar test.jar

我努力了,但我无法弄清楚它失败的原因或如何解决这个问题。我非常感谢你的帮助。

-----附录---- 我忘了提到test.jar中的清单文件是这样的:

    Manifest-Version: 1.0
    Build-Jdk: 1.6.0_13
    Created-By: Apache Maven
    Main-Class: test.Tester
    Archiver-Version: Plexus Archiver

2 个答案:

答案 0 :(得分:3)

您不能在命令行上同时使用-classpath-jar选项。使用其中一个......但不能两者都使用。

当您使用-jar选项时,该命令需要在JAR文件清单中找到入口点类和运行时类路径。您的-classpath参数将被忽略,CLASSPATH环境变量也将被忽略。引用java manual page

  

“使用此选项时,JAR文件是所有用户类的源,其他用户类路径设置将被忽略。”

如果您的(可执行)JAR文件需要使用其他JAR中的内容,那么它需要清单中的Class-Path属性。此属性值是以空格分隔的URL列表;见here

所以在你的情况下,你需要在JAR的清单中添加这样的东西:

Class-path: /path/to/myjars/my.common.jar
Java Tutorial的

This page涵盖了此主题,并包含警告:Class-path清单行必须使用CR或NL正确终止,以便JVM识别它。

答案 1 :(得分:0)

将清单放入test.jar。其他jar通常进入./lib目录。 要向jar中添加META-INF / MANIFEST.MF,通常可以使用构建基础结构:ant或maven。或者手动完成。

你已经拥有了Main-Class:test.Tester。 现在Class-Path:...

在Maven中,依赖项通常会添加到pom.xml中的jar中。您可以使用mvn将自己的jar放入存储库中。然后在pom.xml中添加一个依赖项。