【问题标题】:Class in jar not found at runtime, but was used to compile运行时找不到jar中的类,但用于编译
【发布时间】:2017-01-19 20:45:45
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: java ant runtime java-3d compile-time


    【解决方案1】:

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

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

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

    是的,它会 - 因为它被扩展为:

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

    鉴于this documentation,我不清楚-cp 是否完全适用于-jar

    使用此选项时,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 程序无法区分这两者调用)。

    【讨论】:

    • 感谢 Jon 提供了一个非常容易阅读和理解的答案。一切正常。
    • “我不清楚 -cp 是否适用于 -jar”。事实上,它不起作用。如果您使用--jarjava 命令将静默忽略-cp$CLASSPATH
    • @StephenC:是的——这就是我所期望的(除了-cp 的静默部分),但不想太直率。在我看来,如果您同时指定-cp-jar,它真的应该抱怨...
    • "使用此选项时,JAR 文件是所有用户类的来源,其他用户类路径设置将被忽略。" - 这是一个非常有用的信息,让我今天损失了半天。谢谢!
    猜你喜欢
    • 2019-05-13
    • 2021-06-06
    • 1970-01-01
    • 2013-03-04
    • 2015-07-10
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    相关资源
    最近更新 更多