jar中的类在运行时未找到,但用于编译

noo*_*ook 3 java ant java-3d runtime compile-time

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

Exception in thread "main" java.lang.NoClassDefFoundError: javax/media/j3d/SceneGraphObject
Run Code Online (Sandbox Code Playgroud)

此错误表示j3dcore.jar无法找到其中一个罐子,特别是来自java3d 的罐子.但是,通过将ant构建编译到类文件中时,此jar位于类路径中.

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

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

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

Jon*_*eet 7

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

是的,一点没错.在编译时使类可用不会将类嵌入到输出或类似的东西中.它只是让它可供编译器使用(找出存在的方法等).

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

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

java -cp j3d/foo.jar j3d/bar.jar ... -jar idv.jar
Run Code Online (Sandbox Code Playgroud)

鉴于此文档,我不清楚是否-cp可以使用:-jar

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

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

Class-Path: j3d/foo.jar j3d/bar.jar
Run Code Online (Sandbox Code Playgroud)

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

java -cp j3d/*:idv.jar your.class.name.Here
Run Code Online (Sandbox Code Playgroud)

注意*而不是*.jar,如记录:

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

  • "当您使用此选项时,JAR文件是所有用户类的源,并忽略其他用户类路径设置." - 这是一个非常有用的信息,让我今天失去了半天.谢谢! (2认同)