2011-02-16 83 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文件。