我编写了两个简单的 Java 类(其中一个包含“main()”,另一个由“main()”调用)。
#1 类(包含“main()”):
package daniel347x.outerjar;
import daniel347x.innerjar.Funky;
public class App
{
public static void main( String[] args )
{
Funky.foo();
}
}
#2 类(由“main()”调用):
package daniel347x.innerjar;
public class Funky
{
public static void foo()
{
System.out.println( "Funky!" );
}
}
以上类出现在不同的项目根文件夹中,并使用Maven作为构建系统(每个项目都有自己的POM)。主项目的 pom.xml 文件包含将 daniel347x.outerjar.App 添加为主类的正确条目,并且它正确包含对 daniel347x.innerjar 的依赖项。这两个项目都成功构建为 JAR 文件。
我使用 NetBeans 将它们包装为 Maven 项目(事实上,我使用 NetBeans 创建这两个项目)。当我从 NetBeans 中运行主项目时,它成功运行,并且我看到 Funky!
作为输出。
但是,当我尝试直接从 Windows 命令行 (cmd.exe) 运行主类时,在命令行的类路径上传递包含 Funky
的 JAR 文件,如下所示:
java -classpath "P:\_Dan\work\JavaProjects\JarFuckup\innerjar\target\innerjar-1.0-SNAPSHOT.jar"-jar "P:\_Dan\work\JavaProjects\JarFuckup\outerjar\target\outerjar-1.0-SNAPSHOT.jar"
...我收到可怕的 NoClassDefFoundError
:
Exception in thread "main" java.lang.NoClassDefFoundError: daniel347x/innerjar/Funky
at daniel347x.outerjar.App.main(App.java:7)
我已经仔细确认,在上面提到的包含 Funky
的 innerjar
JAR 文件中,路径结构是 daniel347x\innerjar
并且innerjar
文件夹内是 Funky.class
文件 - 该文件在十六进制编辑器中看起来是正确的,我可以在其中看到代表类名称的 ASCII 字符串。
无法找到该类的事实违背了我对 Java 的理解,我认为 Java 允许您将 JAR 文件作为 -classpath
参数传递,并且它将能够在这些文件中找到类JAR 文件。
这个非常基本的观点让我感到困惑 - 如果能够解释我做错了什么,我们将不胜感激。
最佳答案
使用-jar
时类路径被忽略选项。运行应用程序的一种方法是 java -classpath "P:\_Dan\work\JavaProjects\JarFuckup\innerjar\target\innerjar-1.0-SNAPSHOT.jar";"P:\_Dan\work\JavaProjects\JarFuckup\outerjar\target\outerjar-1.0-SNAPSHOT.jar" daniel347x.outerjar.App
关于Java:简单 JAR 项目在运行时无法在第二个简单 JAR 项目中找到导入的类,即使第二个 JAR 通过 -classpath 传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6253694/