我现在已经坚持这个问题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>
有任何线索吗?如果需要更多信息,请成为我的客人并请求。
感谢您的帮助。
答案 0 :(得分:3)
毕竟,这是一个类加载依赖问题。在SWT类之前加载了JavaFX FXCanvas
。
解决方案是在运行捆绑的JAR时使用-Xbootclasspath/a
将SWT平台特定的JAR添加到bootclasspath。
这个将SWT JAR附加到bootclasspath,使它在需要时可用于JavaFX类。
注意:如果需要,也可以调整大多数IDE运行/调试配置。