Нечетное NoClassDefFoundError - PullRequest
       7

Нечетное NoClassDefFoundError

0 голосов
/ 17 февраля 2011

После установки последней версии 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 ]

1 голос
/ 17 февраля 2011

Одно слово: AppArmor

В моем случае конфигурация не позволяла программе java загружать JAR-файлы из нового пути установки.

Если у вас есть похожая проблема, посмотрите на /var/log/audit.log.Там вы должны увидеть сообщения об ошибках.

1 голос
/ 17 февраля 2011

NoClassDefFoundError происходит, когда сам класс найден, но загрузчик классов не может загрузить все необходимые ему классы.

Можете ли вы проверить заголовки импорта для класса org.gudy.azureus2.ui.swt.Main.java и убедиться, что все импортированные классыможно найти в вашем классе.Если нет, добавьте jar-файлы в ваш путь к классам.

Опубликуйте раздел импорта, если вы хотите, чтобы я помог выяснить, что еще нужно.

0 голосов
/ 17 февраля 2011

Исключением является 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-файлы classpath.

...