2011-06-06 58 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很有用。

相關問題