使用SWT时出现NoClassDefFoundError / ClassNotFoundException

时间:2013-11-14 04:36:02

标签: java maven swt javafx classpath

我现在已经坚持这个问题10小时了。

mvn clean compile install编译代码就好了。当我尝试运行捆绑的JAR时,会出现问题,该JAR构建为包含所有依赖项。仅供参考,它也是在尝试在Eclipse中运行项目时发生的。

我尝试使用-verbose:class作为VM args,同时由java jar和Eclipse IDE运行它。输出显示JVM加载“buggy”类,但我仍然得到异常。

尝试了很多其他选项,比如将SWT本机库提取到与JAR相同的路径,但这也没有用。清理m2缓存的相关部分没有帮助。我还仔细检查了捆绑的JAR中缺少的类,猜猜是什么?它就在那里。

正如大多数人可能已经理解的那样,这是一个更大的项目的一部分,因为无法(轻松)创建一个小的测试用例。我试图创建一个小样本(没有maven),它正在工作。另一个(可能)相关的信息是我在同一个类中同时使用SWT和JavaFX,遵循如何混合它们的工作方法。我正在使用Oracle JDK 1.7。

UPDATE:尝试将“小样本”移动到Maven,到目前为止它运行正常。我想这个问题与maven依赖关系无关。

更新:我成功创建了一个具有相同问题的小项目。这是一个Eclipse项目,但应该可以在没有IDE的情况下轻松运行(因为它是一个Maven项目)。它取决于Linux x64版本的SWT,但您也可以更改该依赖项。请在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>

有任何线索吗?如果需要更多信息,请成为我的客人并请求。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

毕竟,这是一个类加载依赖问题。在SWT类之前加载了JavaFX FXCanvas

解决方案是在运行捆绑的JAR时使用-Xbootclasspath/a将SWT平台特定的JAR添加到bootclasspath。

这个将SWT JAR附加到bootclasspath,使它在需要时可用于JavaFX类。

注意:如果需要,也可以调整大多数IDE运行/调试配置。