4

从 ant 文件构建这个项目后,我收到一个包含我构建的所有类的 jar。当我尝试运行此 jar 时,出现以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: javax/media/j3d/SceneGraphObject

此错误表明j3dcore.jar找不到我正在使用的一个罐子,特别是来自 java3d 的罐子。但是,当通过 ant 编译到类文件中时,此 jar 位于类路径中。

为什么在运行时找不到这个类,而在编译时却找到了?运行 jar 并在 ant 构建中更改它时,我是否必须在我的 shell 中手动更改我的类路径?

如果我将罐子添加到我的类路径中java -cp j3d/*.jar -jar idv.jar

我得到错误Error: Could not find or load main class j3d.j3dutils.jar

4

1 回答 1

8

运行 jar 并在 ant 构建中更改它时,我是否必须在我的 shell 中手动更改我的类路径?

是的,一点没错。在编译时使类可用并不会将该类嵌入到您的输出或类似的东西中。它只是使编译器可以使用它(找出存在哪些方法等)。

如果我使用 java -cp j3d/*.jar -jar idv.jar 将罐子添加到我的类路径中

是的,它会 - 因为它正在扩展到:

java -cp j3d/foo.jar j3d/bar.jar ... -jar idv.jar

鉴于此文档,我不清楚是否-cp要与 一起工作:-jar

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

一种选择是在 jar 文件本身的清单中设置类路径。例如:

Class-Path: j3d/foo.jar j3d/bar.jar

另一个是暂时忽略-jar命令行选项,并使用:

java -cp j3d/*:idv.jar your.class.name.Here

请注意*而不是*.jar,如文档所述:

作为一种特殊的方便,包含 * 基名的类路径元素被认为等同于指定目录中所有文件的列表,扩展名为 .jar 或 .JAR(java 程序无法区分这两个调用之间的区别)。

于 2013-07-10T02:42:52.827 回答