0

安装最新版本的 Vuze (Azureus) 后,我在尝试启动它时遇到了一个奇怪的错误:

> 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不报告错误)。

4

3 回答 3

1

NoClassDefFoundError当找到类本身但类加载器无法加载它需要的所有类时发生。

您能否检查类的导入标头org.gudy.azureus2.ui.swt.Main.java并确保可以在您的类路径中找到所有导入的类。如果没有,请将 jar 文件添加到您的类路径中。

如果您希望我帮助找出仍然需要什么,请发布导入部分。

于 2011-02-16T21:48:21.080 回答
1

一个词:AppArmor

就我而言,配置不允许程序java从新的安装路径加载 JAR。

如果您有类似的问题,请查看/var/log/audit.log. 您应该在那里看到错误消息。

于 2011-02-16T21:55:04.193 回答
0

您的例外是java.lang.NoClassDefFoundError并且不完全是ClassNotFoundException-因此javap仍然可以反汇编该类。

您可能知道NoClassDefFoundError可以将其视为链接错误。我倾向于猜测运行时缺少一些必需的类来执行org.gudy.azureus2.ui.swt.Main 我猜它需要在类路径上使用更多的 JAR。Soorg.gudy.azureus2.ui.swt.Main可用(这就是 javap 工作的原因),但在运行时找不到它的依赖项之一。

运行 SWT 有时还需要-Djava.library.path设置为swt库(查看您的 SO 声誉,我猜您知道这一点)

编辑 这里是一个Azureus shell script的链接,它列出了更多的类路径 JAR。

于 2011-02-16T21:50:21.510 回答