2012-02-04 78 views
1

出在以前工作的應用程序突然間,我得到一個NoClassDefFoundError (wrong name)這一直困擾着我。我正在使用一個XML綁定框架,通過使用配置的類名稱調用ClassLoader.loadClass()來嘗試在請求時解析綁定類。 (在這種情況下,爲什麼它的行爲超出了我的範圍。)現在我得到剛剛在java.lang.ClassLoader.defineClass()處提到的例外情況。在方法的文檔說,它會拋出一個NoClassDefFoundError如果參數name不等於指定的類的二進制名稱。我知道,在這種情況下,一個期望得到的形式NoClassDefFoundError的:A(錯誤的名稱:A)

java.lang.NoClassDefFoundError: A (wrong name: B) 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:786) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:144) 
at java.net.URLClassLoader.defineClass(URLClassLoader.java:382) 
    .... 

的一個例外,這是結果我居然看到,但奇怪的是,在我的情況報告AB是完全一樣的!我試圖調試應用程序。 JDK源代碼行顯示如下:

 c = defineClass1(name, b, off, len, protectionDomain, source); 

source的值是OK。我將字節數組b保存到一個類文件,並用反編譯器檢查它,並且它再次正常。當然Class.forName()整個報告相同的錯誤,但真正有趣的事情是,如果我在調試模式下設置name = null我得到這個野獸:

java.lang.LinkageError: loader (instance of com/google/gwt/dev/shell/jetty/JettyLauncher$WebAppContextWithReload$WebAppClassLoaderExtension): attempted duplicate class definition for name: "A" 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:786) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:144) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:382) 

現在我覺得完全無能這個:(我感謝你的幫助。

有問題的類加載器是com.google.gwt.dev.shell.jetty.JettyLauncher.WebAppContextWithReload.WebAppClassLoaderExtension在重要的情況下。

+0

你做任何改變和重新編譯應用程序?如果這樣,那是什麼 ? – 2012-02-04 16:49:58

+0

讓我改正:我沒有真正測試過這部分應用程序,所以錯誤一直存在。 – Saintali 2012-02-04 17:06:14

回答

4

解決。只是一個令人尷尬的大寫問題。名稱ANoClassDefFoundError: A (wrong name: B)B實際上沒有由資本不同。

這是因爲它不區分大小寫的文件系統的Windows上。如果您尋找名爲FooBar的類並且該文件夾包含文件Foobar.class,類加載器將打開類文件,但在內部發現它具有不同的名稱。因此例外。

+0

請您詳細說明一下嗎?我被困在類似的東西上。 – Magpie 2012-09-22 19:39:36

+0

@Magpie更新。 – Saintali 2012-09-22 19:44:22

0

檢查類A和B.機遇包聲明是他們要麼沒有一些包裝或包裝聲明中包聲明不正確。