0

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

当我像这样启动 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
4

2 回答 2

3

您不能在命令行上同时使用-classpath和选项。-jar使用其中一种……但不能同时使用。

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

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

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

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

Class-path: /path/to/myjars/my.common.jar

Java 教程的这一页涵盖了该主题,并包含警告,即Class-path清单行必须以 CR 或 NL 正确终止,以便 JVM 识别它。

于 2012-11-19T22:16:44.903 回答
0

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

Main-Class: test.Tester 已经有了它。现在类路径:...

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

于 2012-11-19T22:20:27.330 回答