我编写了两个简单的Java类(其中一个包含“main()”,另一个包含“main()”)。
Class#1(包含“main()”):
package daniel347x.outerjar;
import daniel347x.innerjar.Funky;
public class App
{
public static void main( String[] args )
{
Funky.foo();
}
}
Class#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)
我仔细确认,在上面提到的包含innerjar
的{{1}} JAR文件中,路径结构为Funky
,而daniel347x\innerjar
文件夹中的innerjar
文件夹为{ {1}}文件 - 这个文件在HEX编辑器中看起来是正确的,在那里我可以看到代表该类名称的ASCII字符串。
无法找到该类的事实违背了我对Java的理解,我认为这允许您将JAR文件作为Funky.class
参数传递,并且它将能够在这些JAR文件中查找类。 / p>
这个非常基本的观点让我感到沮丧 - 这个答案可以解释我做错了什么。非常感谢。
答案 0 :(得分:2)
使用-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
答案 1 :(得分:0)
或许更好的方法是向Jar添加manifest文件,该文件通过相对路径指定相关JAR的class path。然后..
java -jar "P:\_Dan\...\outerjar-1.0-SNAPSHOT.jar"
..应该这样做。
双击主Jar也将启动它。这对GUI来说非常有用。