【问题标题】:Can't make Executable JAR file with library in Eclipse无法在 Eclipse 中使用库制作可执行 JAR 文件
【发布时间】:2012-12-01 03:46:25
【问题描述】:

我正在尝试将我的项目导出为可执行 jar,除了一件事之外一切都很好:有 2 个窗口 - 第一个是主 jframe,第二个是使用 jzy3d 库制作 3D 表面的 jframe;第一个窗口包含用于执行第二个 jframe 的“显示”按钮。当我在 Eclipse 中执行这个项目时它工作得很好,但是当我制作可执行 jar 时它被执行,但是如果我点击“显示”按钮,第二个 jframe 不会打开。所以,请告诉我,我该如何解决?

更新:来自 cmd 的信息:

Catched FileNotFoundException: C:\destination-natives-windows-i586.jar (═х єфр
ё  эрщЄш єърчрээ√щ Їрщы), while TempJarCache.bootstrapNativeLib() of jar:file:
:/destination-natives-windows-i586.jar!/ (file:/C:/ + destination-natives-wind
s-i586.jar)
Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: no glue
n-rt in java.library.path
        at java.lang.ClassLoader.loadLibrary(Unknown Source)
        at java.lang.Runtime.loadLibrary0(Unknown Source)
        at java.lang.System.loadLibrary(Unknown Source)
        at com.jogamp.common.jvm.JNILibLoaderBase.loadLibraryInternal(JNILibLo
erBase.java:454)
        at com.jogamp.common.jvm.JNILibLoaderBase.access$000(JNILibLoaderBase.
va:59)
        at com.jogamp.common.jvm.JNILibLoaderBase$DefaultAction.loadLibrary(JN
ibLoaderBase.java:90)
        at com.jogamp.common.jvm.JNILibLoaderBase.loadLibrary(JNILibLoaderBase
ava:328)
        at com.jogamp.common.os.DynamicLibraryBundle$GlueJNILibLoader.loadLibr
y(DynamicLibraryBundle.java:390)
        at com.jogamp.common.os.Platform$2.run(Platform.java:249)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.jogamp.common.os.Platform.loadGlueGenRTImpl(Platform.java:231)
        at com.jogamp.common.os.Platform.<clinit>(Platform.java:183)
        at javax.media.opengl.GLProfile.<clinit>(GLProfile.java:99)
        at org.jzy3d.global.Settings.<init>(Settings.java:12)
        at org.jzy3d.global.Settings.getInstance(Settings.java:21)
        at com.nda.fuzzy.views.SurfaceViewerFrame.<init>(SurfaceViewerFrame.ja
:102)
        at com.nda.fuzzy.views.MainFrame$26.actionPerformed(MainFrame.java:579
        at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
        at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
        at javax.swing.AbstractButton.doClick(Unknown Source)
        at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
        at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknow
Source)
        at java.awt.Component.processMouseEvent(Unknown Source)
        at javax.swing.JComponent.processMouseEvent(Unknown Source)
        at java.awt.Component.processEvent(Unknown Source)
        at java.awt.Container.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Window.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$200(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown So
ce)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown So
ce)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown So
ce)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)

【问题讨论】:

  • 请发布您的错误/堆栈跟踪。
  • 执行中没有任何消息
  • 不要双击 jar 文件,而是打开一个终端窗口(也称为控制台或 CMD 或命令提示符),cd 到包含 jar 文件的目录,然后运行 ​​java -jar yourjarfilename.jar。然后您会在终端窗口中看到错误消息。

标签: java eclipse


【解决方案1】:

可能在命令行上你没有指定 jzy3d 库的类路径

你可以用 lib 运行一个 jar 文件:

"java -cp libs/* -jar program.jar"

您将 lib (jzy3d.jar) 放入 libs 文件夹的位置

如果您使用了一些创建可执行 jar 文件的特殊工具, 那么您必须配置该工具以包含要在 exe 中使用的 jzy3d.jar 库。

【讨论】:

  • 我通过 Eclipse 制作 JAR 而不使用命令行。你能帮帮我吗?
  • 有 excecutabel jar 文件,文件扩展名为 .jar 还是 .exe ?您是从资源管理器中点击还是从 exlipse 中点击?
  • 可执行文件具有 jar 扩展名。我从资源管理器中单击,从 Eclipse 中将其作为项目执行
  • 创建一个批处理文件 myStart.bat,它调用“java -cp libs/* -jar program.jar”。然后在批处理文件上计时。首先尝试从命令行开始,然后当你能够做到这一点时,尝试批处理文件。
  • 如果你在jarfile的manifest中指定了classpath,就不需要批处理文件了。
【解决方案2】:

您需要执行以下操作之一:

  1. 将每个jarfile依赖的内容重新打包到你自己的可执行jarfile中
  2. 使用 .exe 包装器(例如 Launch4j)将您的 jar 文件打包成一个自解压和启动的可执行文件
  3. 从 Eclipse 创建可执行 jarfile 时,在 MANIFEST.MF 的 Class-Path 属性中包含 jarfile 依赖项,并在分发应用程序时将这些依赖项包含在适当的相对位置

在上述选项中,1 对您来说可能是最简单和最方便的。如果您将 jarfile 依赖项的内容提取到 Eclipse 项目中,那么在使用 Eclipse 的向导创建 jarfile 时很容易包含这些资源。

选项 2 和 3 也非常简单,但我建议您制作一个 ant 脚本,这样您就可以一键构建。

【讨论】:

  • 请看我的堆栈跟踪
猜你喜欢
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多