Java:简单的JAR项目,在运行时,在第二个简单的JAR项目中找不到导入的类,即使第二个JAR通过-classpath传递

时间:2011-06-06 14:40:32

标签: java maven classpath

我编写了两个简单的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>

这个非常基本的观点让我感到沮丧 - 这个答案可以解释我做错了什么。非常感谢。

2 个答案:

答案 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来说非常有用。