2011-02-16 100 views
0

安裝最新版本的Vuze(Azureus的)後,我得到了一個奇怪的錯誤嘗試啓動它:奇的NoClassDefFoundError

> java -Xmx128m -classpath ./Azureus2.jar:./swt.jar -Djava.library.path=/bt_work/vuze -Dazureus.install.path=/bt_work/vuze -Dazureus.script=./azureus -Dazureus.script.version=2 org.gudy.azureus2.ui.swt.Main 
Exception in thread "main" java.lang.NoClassDefFoundError: org/gudy/azureus2/ui/swt/Main 
Caused by: java.lang.ClassNotFoundException: org.gudy.azureus2.ui.swt.Main 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 

有什麼奇怪的是這樣的:

> javap -classpath ./Azureus2.jar:./swt.jar org.gudy.azureus2.ui.swt.Main 
Compiled from "Main.java" 
public class org.gudy.azureus2.ui.swt.Main extends java.lang.Object{ 
    public static final java.lang.String PR_MULTI_INSTANCE; 
... 

所以...運行帶有相同類路徑的javap找到該類,但僅有java不能。 WTF正在進行?

我檢查了兩個程序來自同一個安裝Java(/usr/lib64/jvm/java-1.6.0-sun),這是Java 6,並且這些類是爲Java 5編譯的。清單沒有簽名。 JAR文件是可讀的(unzip -t報告沒有錯誤)。

回答

1

一個字:AppArmor

在我的情況下,配置並沒有讓程序java從新安裝路徑載入的JAR文件。

如果你有類似的問題,看看/var/log/audit.log。你應該看到那裏的錯誤信息。

1

NoClassDefFoundError當類本身被發現,但發生的類加載器無法加載需要的全部課程。

您可以查看進口頭爲org.gudy.azureus2.ui.swt.Main.java類,並確保所有導入的類可以在類路徑中找到。如果沒有,請將jar文件添加到您的類路徑中。

後進口部分如果你要我幫忙找出仍然需要。

0

你的例外是java.lang.NoClassDefFoundError而不是完全是ClassNotFoundException - 所以javap仍然能夠反彙編該類。

正如你可能知道NoClassDefFoundError可以被看作是一個鏈接錯誤。我傾向於猜測,運行時缺少一些必要的類來執行org.gudy.azureus2.ui.swt.Main 我想這需要在類路徑更加JAR文件。 所以org.gudy.azureus2.ui.swt.Main可用(這就是爲什麼javap的作品),但其運行時沒有找到它的依賴項之一。

還運行SWT有時需要-Djava.library.path設置爲swt庫(在你的名聲SO找我猜你應該知道這一點)

編輯 這裏是一個Azureus shell script的鏈接,其中列出了更多的類路徑中的JAR文件。