【问题标题】:NoClassDefFoundError/ClassNotFoundException while using SWT使用 SWT 时出现 NoClassDefFoundError/ClassNotFoundException
【发布时间】:2013-11-14 04:36:02
【问题描述】:

我被这个问题困扰了大约 10 小时。

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

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

也尝试了许多其他选项,例如将 SWT 本地库提取到与 JAR 相同的路径,但这也不起作用。清理我的 m2 缓存的相关部分没有帮助。我还仔细检查了捆绑的 JAR 中缺少的类,你猜怎么着?就在那儿。

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

更新: 尝试将“小样本”移动到 Maven 并且运行良好,到目前为止。我想这个问题与maven依赖或其他东西无关。

更新:我设法创建了一个有同样问题的小项目。这是一个 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>

有什么线索吗?如果需要更多信息,请成为我的客人并索取。

感谢您的帮助。

【问题讨论】:

    标签: java maven swt javafx classpath


    【解决方案1】:

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

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

    追加 SWT JAR 到引导类路径,使其可在JavaFX 类需要时使用。

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

    【讨论】:

      猜你喜欢
      • 2013-04-26
      • 2020-05-17
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 2023-03-08
      • 2016-03-11
      相关资源
      最近更新 更多