1

我现在被这个问题困扰了 10 小时。

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

我在通过 Eclipse IDE-verbose:class运行它时尝试使用as VM args。java jar输出显示 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>

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

谢谢你的帮助。

4

1 回答 1

3

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

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

会将SWT JAR 附加到 bootclasspath,使其在 JavaFX 类需要时可用。

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

于 2013-11-27T08:41:21.800 回答