2011-06-06 68 views
0

我写了两个简单的Java类(其中一个包含“main()”,并且另一个由“main()”调用)。Java:简单JAR项目运行时,即使通过-classpath传递了第二个JAR,也无法在第二个简单JAR项目中找到导入的类

级#1(含有 “主()”):

package daniel347x.outerjar; 
import daniel347x.innerjar.Funky; 
public class App 
{ 
    public static void main(String[] args) 
    { 
     Funky.foo(); 
    } 
} 

类#2(由称为 “主()”):

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 JAR文件中包含上述提到Funky,塔t路径结构为daniel347x\innerjar,而innerjar文件夹内部为Funky.class文件 - 在HEX编辑器中此文件看起来正确,我可以在其中看到代表类名称的ASCII字符串。

该类无法找到的事实无法证明我对Java的理解,我认为它允许您将JAR文件作为-classpath参数传递,并且它将能够在这些JAR文件中查找类。

这个非常基本的点我flummoxed - 一个解释我做错了的答案将不胜感激。

回答

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

+0

非常好!谢谢。 – 2011-06-06 15:09:59

0

也许更好的方法是将manifest文件添加到Jar中,该文件通过相对路径指定依赖Jars的class path。然后..

java -jar "P:\_Dan\...\outerjar-1.0-SNAPSHOT.jar" 

..应该这样做。

双击主Jar也会启动它。这对GUI很有用。

相关问题