在通过eclipse运行正常的代码,但使用java -jar执行时失败。

3
最近我一直在着手打包一个项目,但却变成了一场噩梦。问题简而言之就是:我想将项目打包成一个 jar 文件,并最终用作 Java Web Start。通过 Eclipse 构建和运行代码时,它能正常工作。然而,当我将其导出为“可运行的 jar”并尝试通过终端运行时,我会得到晦涩难懂的异常信息,这些异常似乎取决于引用的库。我已经检查了库是否存在于 jar 文件中,所以它们不是缺失的问题。
根据导出方式的不同,异常的具体细节也有所不同,但似乎源自同一问题。下面是在将依赖库打包为“main” jar 中的 jar 时抛出的堆栈轨迹。
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.ExceptionInInitializerError
at org.eclipse.gef.tools.MarqueeSelectionTool.<init>(MarqueeSelectionTool.java:99)
at org.gvt.MarqueeZoomTool.<init>(MarqueeZoomTool.java:16)
at org.gvt.action.MarqueeZoomToolAction$1.<init>(MarqueeZoomToolAction.java:28)
at org.gvt.action.MarqueeZoomToolAction.createTool(MarqueeZoomToolAction.java:28)
at org.gvt.action.AbstractGEFToolAction.<init>(AbstractGEFToolAction.java:24)
at org.gvt.action.MarqueeZoomToolAction.<init>(MarqueeZoomToolAction.java:20)
at org.gvt.TopMenuBar.createBarMenu(TopMenuBar.java:113)
at org.gvt.ChisioMain.createMenuManager(ChisioMain.java:612)
at org.eclipse.jface.window.ApplicationWindow.addMenuBar(ApplicationWindow.java:235)
at org.gvt.ChisioMain.main(ChisioMain.java:144)
... 5 more
Caused by: java.lang.IllegalArgumentException: Argument cannot be null
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.graphics.Resource.<init>(Unknown Source)
at org.eclipse.swt.graphics.Cursor.<init>(Unknown Source)
at org.eclipse.draw2d.Cursors.<clinit>(Cursors.java:170)
... 15 more

顺便说一下,我保存了导出过程的XML / ANT输出,如果有兴趣,我可以添加它。为了减少混乱,我选择省略它。

你有什么想法可能是问题所在?

编辑:我开始想这是否是SWT-GTK库的32/64位问题。有人可以确认或否认吗?


如果我没记错的话,Eclipse允许您指定与命令行不同的类路径;您的JAR文件中可能缺少一些依赖项/库。 - Piskvor left the building
据我所知,所有的库都包含在jar文件中,我特别检查了swt包:swt-3.4.2-gtk-linux-x86.jar。 至于类路径,在运行配置中没有特定的内容。这真的很奇怪,因为我曾经使用同一个项目的旧版本做过同样的事情,而且我不记得有这么多问题。 - posdef
如果在Windows上,请尝试以管理员身份运行。 - Joshua Drake
2个回答

0

0

你在这里遇到的异常不是关于依赖项的。这是一个编程错误:“有人将空参数传递给不允许它的SWT方法”。

根据堆栈跟踪,您正在使用GEF。您如何在Eclipse中运行代码,作为Java应用程序还是Eclipse应用程序?

如果您说的是Eclipse应用程序,您不能简单地将其导出为可运行的Jar文件。您将不得不创建一个RCP。在Google上搜索RCP教程,您会找到许多有趣的结果。


我确实意识到了那个空参数的问题,但是如果它与我的编程有关,那么在从Eclipse运行时它就会执行失败。顺便说一下,这段代码是作为Java应用程序运行的。 - posdef
所以你有一个使用SWT/Draw2d/GEF的独立Java应用程序。是这样吗?仔细查看后,似乎在创建光标时出现了错误。根据SWT的说法:“ERROR_NULL_ARGUMENT-如果设备为null且没有当前设备”,因为Draw2d以静态方式创建带有null参数的SWT光标,它依赖于存在当前设备的事实。这意味着当前线程是主线程,我想。 - Manuel Selva
我不完全确定我理解你的意思,但是为什么在终端中运行时绘制光标会成为问题,而当软件通过eclipse运行时显然没有问题呢? - posdef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接