我创建了两个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
答案 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中添加一个依赖项。