【问题标题】:Execution fails via java -jar while the same code runs fine through eclipse通过 java -jar 执行失败,而相同的代码通过 eclipse 运行良好
【发布时间】:2011-04-24 19:15:19
【问题描述】:

我最近一直在打包一个项目,但它变成了一场噩梦。简而言之,这就是问题所在。我有一个项目,我想将其作为 jar 文件,并最终将其用作 Java Web Start。

当我尝试通过 Eclipse 构建和运行代码时,它运行良好。但是,当我将它导出为“可运行 jar”并尝试通过终端运行它时,我得到了似乎依赖于引用库的神秘异常。我已经检查了 jar 文件中是否存在这些库,所以并不是它们丢失了。

根据我如何导出它,异常的细节会发生变化,而它似乎源于同一个问题。下面是导出项目时抛出的堆栈跟踪,其中依赖库打包为“主”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 位问题。任何人都可以确认或否认这一点吗?

【问题讨论】:

  • IIRC,Eclipse 允许您指定与命令行不同的类路径;您的 JAR 中可能缺少一些依赖项/库。
  • 据我所知,所有的库都包含在jar文件中,我特别检查了swt包:swt-3.4.2-gtk-linux-x86.jar。至于类路径,运行配置中没有任何具体内容。这真的很奇怪,因为我设法用同一个项目的旧版本做同样的事情,而且我不记得有这么多问题。
  • 如果在 Windows 上尝试以 Administrator 身份运行

标签: java eclipse jar export


【解决方案1】:

您在这里遇到的例外与依赖关系无关。这是一个编程错误:“有人将空参数传递给不允许的 SWT 方法)。

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

如果您谈论的是 Eclipse 应用程序,您不能简单地将其导出为可运行的 Jar。您必须创建一个 RCP。在 Google 上查找 RCP 教程,您会发现很多有趣的结果。

【讨论】:

  • 我确实意识到那里的空参数问题,但是如果它与我的编程有关,它在从 Eclipse 运行时将无法执行。代码作为 Java Application btw 运行
  • 所以你有一个使用 SWT/Draw2d/GEF 的独立 Java 应用程序。这样对吗 ?仔细查看后,您似乎在创建光标时出错。根据 SWT:“ERROR_NULL_ARGUMENT - 如果设备为空且没有当前设备”因为 Draw2d 以静态方式创建带有空参数的 SWT 游标,它依赖于存在当前设备的事实。这意味着当前线程是我认为的主线程。
  • 我不是 100% 确定我会关注你,但是为什么在终端中运行时绘制光标会成为问题,而通过 eclipse 运行软件时显然没有问题?
【解决方案2】:

事实证明,eclipse 在我的机器上运行 32 位 JVM(出于某种奇怪的原因),是的,它是关于 SWT 的 os 和 arch 特定库的。有类似问题的朋友可以参考下面的帖子了解更多信息:

Problems with loading resources during execution

Running SWT based, cross-platform jar properly on a Mac

祝你好运,

【讨论】:

    猜你喜欢
    • 2012-04-06
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多