2011-02-25 73 views
1

嗨我試圖從我自己的代碼中使用外部Java包,並繼續得到NoClassDefFoundError,即使我使用的是我編譯的類路徑。NoClassDefFoundError當在編譯和運行時指定相同的jar文件時拋出

爲了您的娛樂我已經包括了什麼,無疑將是一個愚蠢的錯誤在我的部分(我已經在這個約6個小時)的

/* WTF/WTF.java */ 
import foo.Bar; 
class WTF 
{ 
    public static void main(String[] args) 
    { 
     Bar dontCare = new Bar(); 
    } 
} 

/* WTF/foo/Bar.java */ 
package foo; 

class Bar 
{ 
    public Bar() {} 
} 

現在從WTF一個光禿禿的骨頭再現目錄我運行以下:

 
javac foo/Bar.java    [ok] 
javac WTF.java     [ok] 
java WTF      [ok] 
jar cf foo.jar foo    [ok] 

我刪除了WTF/foo目錄,所以只有WTF/foo.jar可用。

 
javac WTF.java -cp foo.jar  [ok] 
java WTF -cp foo.jar   [[email protected]#$!] 
 
Exception in thread "main" java.lang.NoClassDefFoundError: foo/Bar 
    at WTF.main(WTF.java:7) 
Caused by: java.lang.ClassNotFoundException: foo.Bar 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266) 

任何線索不勝感激!

+0

我不知道這是否編譯! – adarshr 2011-02-25 12:27:47

+0

我的錯誤Bar在我的測試文件中被公開標記了,但是在編寫列表時我錯過了它 - 除了它是編譯 – norlesh 2011-02-25 12:47:55

回答

1

哪裏是WTF.class的目錄應該是在classpath。 另外,Bar應該是公開的。

java -cp foo.jar:. WTF 

:是在Linux上的路徑分隔符,如果你使用的是Windows與;更換。

+0

不是,根據錯誤消息找到了'WTF',但沒有找到'foo.Bar'。 – 2011-02-25 12:40:38

+0

感謝克里斯,工作(我在Linux中) – norlesh 2011-02-25 12:44:28

+0

@christoffer:是的,但類路徑參數必須在主類名稱之前,我認爲當前目錄應該在它 – Kru 2011-02-26 17:36:17

1

錯誤的參數序列?嘗試:

java -cp foo.jar WTF 
+0

聽起來像它。主類名後面的參數是程序的參數。但是它應該是'java -cp。:foo.jar WTF'來包含本地目錄(如果它包含'WTF.class'的話)。 – 2011-02-25 12:41:22