Нечетное NoClassDefFoundError
После установки последней версии 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
сообщает об отсутствии ошибок).
3 ответа
Одним словом: AppArmor
В моем случае, конфиг не позволил программе java
загрузить файлы JAR из нового пути установки.
Если у вас есть похожая проблема, посмотрите на /var/log/audit.log
, Вы должны увидеть сообщения об ошибках там.
NoClassDefFoundError
происходит, когда сам класс найден, но загрузчик классов не может загрузить все классы, в которых он нуждается.
Можете ли вы проверить заголовки импорта для класса org.gudy.azureus2.ui.swt.Main.java
и убедитесь, что все импортированные классы находятся в вашем пути к классам. Если нет, добавьте файлы jar в ваш путь к классам.
Разместите раздел импорта, если вы хотите, чтобы я помог выяснить, что еще нужно.
Ваше исключение 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, в котором перечислены дополнительные JAR-файлы классов.