2013-11-14 4 views
1

Я застрял в этой проблеме примерно за 10 часов.NoClassDefFoundError/ClassNotFoundException при использовании SWT

mvn clean compile install компилирует код просто отлично. Проблема возникает, когда я пытаюсь запустить объединенный JAR, созданный для включения всех зависимостей. FYI, это происходит при попытке запустить проект внутри Eclipse.

Я пробовал использовать -verbose:class как VM args во время его запуска java jar и через Eclipse IDE. Результат показывает, что JVM загружает класс «багги», но я все еще получаю исключение.

Пробовал много других вариантов, например, извлечение библиотек SWT на тот же путь, что и JAR, но это тоже не сработало. Очистка соответствующей части кеша m2 не помогла. Я также дважды проверил связанный JAR для отсутствующего класса и, угадайте, что? Это прямо сейчас.

Поскольку большинство из вас, возможно, уже поняли, это часть гораздо большего проекта, для которого не может быть (легко) создан небольшой тестовый пример. Я попытался создать небольшой образец (без maven), и он работает. Другая (вероятно) важная часть информации заключается в том, что я использую как SWT, так и JavaFX в этом же классе, следуя рабочим рецептам о том, как их смешивать. И я использую Oracle JDK 1.7.

UPDATE: попытался переместить «маленький образец» в Maven, и пока он работает нормально. Я полагаю, что проблема не связана с зависимостью maven или чем-то еще.

UPDATE: Мне удалось создать небольшой проект, который имеет ту же проблему. Это проект Eclipse, но его нужно легко запускать без IDE (так как это проект Maven). Это зависит от версии SWT для Linux x64, но вы также можете изменить эту зависимость. Пожалуйста, проверьте его на https://dl.dropboxusercontent.com/u/5319290/swtjfx.tar.gz

Пакетообрезчик исключение след:

Exception in thread "main" 
java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Canvas 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:412) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2531) 
    at java.lang.Class.getMethod0(Class.java:2774) 
    at java.lang.Class.getMethod(Class.java:1663) 
    at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486) 
[Loaded java.util.Objects from /usr/lib/jvm/java-7-oracle/jre/lib/rt.jar] 
Caused by: java.lang.ClassNotFoundException: org.eclipse.swt.widgets.Canvas 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    ... 19 more 

-verbose:class выход:

... 
[Loaded org.eclipse.swt.widgets.Layout from file:/home/me/myapp-jar-with-dependencies.jar] 
[Loaded org.eclipse.swt.layout.FillLayout from file:/home/me/myapp-jar-with-dependencies.jar] 
[Loaded org.eclipse.swt.graphics.Drawable from file:/home/me/myapp-jar-with-dependencies.jar] 
[Loaded org.eclipse.swt.widgets.Widget from file:/home/me/myapp-jar-with-dependencies.jar] 
[Loaded org.eclipse.swt.widgets.Control from file:/home/me/myapp-jar-with-dependencies.jar] 
[Loaded org.eclipse.swt.widgets.Scrollable from file:/home/me/myapp-jar-with-dependencies.jar] 
[Loaded org.eclipse.swt.widgets.Composite from file:/home/me/myapp-jar-with-dependencies.jar] 
[Loaded org.eclipse.swt.widgets.Canvas from file:/home/me/myapp-jar-with-dependencies.jar] 
[Loaded org.eclipse.swt.widgets.Decorations from file:/home/me/myapp-jar-with-dependencies.jar] 
[Loaded org.eclipse.swt.widgets.Shell from file:/home/me/myapp-jar-with-dependencies.jar] 
[Loaded java.lang.ClassFormatError from /usr/lib/jvm/java-7-oracle/jre/lib/rt.jar] 
[Loaded java.lang.NoSuchMethodException from /usr/lib/jvm/java-7-oracle/jre/lib/rt.jar] 
[Loaded java.lang.Throwable$PrintStreamOrWriter from /usr/lib/jvm/java-7-oracle/jre/lib/rt.jar] 
[Loaded java.lang.Throwable$WrappedPrintStream from /usr/lib/jvm/java-7-oracle/jre/lib/rt.jar] 
[Loaded java.util.IdentityHashMap from /usr/lib/jvm/java-7-oracle/jre/lib/rt.jar] 
[Loaded java.util.IdentityHashMap$KeySet from /usr/lib/jvm/java-7-oracle/jre/lib/rt.jar] 
[Loaded java.util.Objects from /usr/lib/jvm/java-7-oracle/jre/lib/rt.jar] 
[Loaded java.lang.Shutdown from /usr/lib/jvm/java-7-oracle/jre/lib/rt.jar] 
[Loaded java.lang.Shutdown$Lock from /usr/lib/jvm/java-7-oracle/jre/lib/rt.jar] 

Соответствующая часть моей POM:

<repositories> 
    ... 
    <repository> 
    <id>swt-repo</id> 
    <url>https://swt-repo.googlecode.com/svn/repo/</url> 
    </repository> 
</repositories> 
... 
<dependencies> 
    ... 
    <dependency> 
    <groupId>org.eclipse.swt</groupId> 
    <artifactId>org.eclipse.swt.gtk.linux.x86_64</artifactId> 
    <version>4.3</version> 
    </dependency> 
</dependencies> 

Любой ключ ? Если вам нужна дополнительная информация, будьте моим гостем и попросите, пожалуйста.

Спасибо за любую помощь.

ответ

3

В конце концов, это была проблема с загрузкой класса. JavaFX FXCanvas загружался перед классами SWT.

Решение заключалось в том, чтобы добавить JAR для конкретной платформы SWT к bootclasspath, используя -Xbootclasspath/a при запуске связанного JAR.

Этот добавляет SWT JAR к bootclasspath, делая его доступным для классов JavaFX, когда он в этом нуждается.

Примечание: также возможно выполнить эту настройку большинства конфигураций запуска/отладки IDE, если вам это нужно.