我寫了兩個簡單的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