我写了两个简单的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 - 一个解释我做错了的答案将不胜感激。
非常好!谢谢。 – 2011-06-06 15:09:59