2016-10-19 91 views
0

我在下面的路徑中有一個TEST123.class。Got NoClassDefFoundError:錯誤的Windows路徑名稱

d:/用戶/ XXX /桌面/ SEM-材料工作/ SEM-材料工作/ SEM-材料freemarkerjob /目標/班/ COM /攜程網/市場/ SEM/freemarkerjob/dynamicjava/

然後我運行下面的try子句來加載由URLClassLoader的類,但它給我的異常ava.lang.NoClassDefFoundError:TEST123(錯誤的名稱:,如何解決異常

ava.lang.NoClassDefFoundError: TEST123 (wrong name: com/ctrip/market/sem/freemarkerjob/dynamicjava/TEST123) 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 

    try { 
       URLClassLoader mycl = new URLClassLoader(new URL[] { new URL(
         "file:///D:/Users/XXX/Desktop/sem-material-job/sem-material-job/sem-material-freemarkerjob/target/classes/com/ctrip/market/sem/freemarkerjob/dynamicjava/") }); 
       Class c2 = mycl.loadClass("TEST123"); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
+0

好像有Java類coflict。類URLClassLoader有兩個或兩個以上的實現。請檢查可能有兩個實現在不同的罐子。 –

+0

URLClassLoader來自包java.net.URLClassLoader;所以應該有一個實現。從錯誤消息「NoClassDefFoundError:TEST123(錯誤的名稱:」,似乎我指定的路徑是錯誤的,但我不知道如何解決它。 – Jason

+0

addurl upto目標/類和使用全限定類名稱加載類 – hunter

回答

1

我認爲你必須改變你的URL指向通過包名類路徑和負載類,像這樣

URLClassLoader mycl = new URLClassLoader(new URL[] { 
new URL("file:///D:/Users/XXX/Desktop/sem-material-job/sem-material-‌​job/sem-material-fre‌​emarkerjob/target/cl‌​asses/") }); 

Class c2 = mycl.loadClass("com.ctrip.market.sem.freemarkerjob.dynamicja‌​va.TEST123"); 
+0

如果我們可以將絕對路徑文件更改爲/// D:/ Users/XXX/Desktop/sem-material-job/sem-material-job/sem-material-freemarkerjob/target/classes /到相關路徑,必須運行程序到Linux,所以Windows路徑D:/ Users/XXX/..是無效的。 – Jason

+0

這取決於您的需求,有不同的方式來設置與plateforme相關的路徑。 –

1

你試圖加載類TEST123,但您的TEST123.class文件包含類com.ctrip.market.sem.freemarkerjob.dynamicjava.TEST123。第一行中的包是什麼?將您的代碼更改爲

URLClassLoader mycl = new URLClassLoader(new URL[] { 
     new URL("file:///D:/Users/XXX/Desktop/sem-material-job/sem-material-job/sem-material-freemarkerjob/target/classes/") }); 
Class c2 = mycl.loadClass("com.ctrip.market.sem.freemarkerjob.dynamicjava.TEST123"); 

應該有效。

+0

Ye s,你和andolsi給出了正確的答案,非常感謝你。 – Jason

相關問題