从ant文件构建这个项目之后,我收到一个包含我构建的所有类的jar。当我尝试运行这个jar时,我收到以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: javax/media/j3d/SceneGraphObject
此错误表示无法找到其中一个jar,特别是来自java3d的j3dcore.jar
。但是,通过将ant构建编译到类文件中时,此jar位于类路径中。
为什么在运行时找不到这个类,但是在编译时可以找到它?在运行jar时我是否必须在shell中手动更改我的类路径以及在ant构建中更改它?
如果我使用java -cp j3d/*.jar -jar idv.jar
我收到错误Error: Could not find or load main class j3d.j3dutils.jar
答案 0 :(得分:7)
运行jar时我是否必须手动更改shell中的classpath,并在ant build中更改它?
是的,绝对的。在编译时使类可用不会将类嵌入到输出或类似的东西中。它只是让它可供编译器使用(找出存在的方法等)。
如果我使用java -cp j3d / *将jar添加到我的类路径中.jar -jar idv.jar
是的,它会 - 因为它正在扩展为:
java -cp j3d/foo.jar j3d/bar.jar ... -jar idv.jar
我不清楚-cp
是否适用于-jar
,this documentation:
使用此选项时,JAR文件是所有用户类的源,并忽略其他用户类路径设置。
一个选项是set the classpath within the manifest of the jar file itself。例如:
Class-Path: j3d/foo.jar j3d/bar.jar
另一种方法是暂时忽略-jar
命令行选项,并使用:
java -cp j3d/*:idv.jar your.class.name.Here
请注意*
而非*.jar
,如文档所述:
作为一种特殊的方便,包含基本名称*的类路径元素被认为等同于指定扩展名为.jar或.JAR的目录中的所有文件的列表(java程序无法区分两者之间的区别)调用)。