5

我正在使用WorldWind Java和 Eclipse。

我正在尝试从 Eclipse 中的项目中导出一个可运行的 jar。导出顺利,但是当我尝试运行 jar 时出现此错误:

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.UnsatisfiedLinkError: no gluegen-rt in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1681)
    at java.lang.Runtime.loadLibrary0(Runtime.java:840)
    at java.lang.System.loadLibrary(System.java:1047)
    at com.sun.gluegen.runtime.NativeLibLoader.loadLibraryInternal(NativeLibLoader.java:102)
    at com.sun.gluegen.runtime.NativeLibLoader.access$000(NativeLibLoader.java:51)
    at com.sun.gluegen.runtime.NativeLibLoader$1.run(NativeLibLoader.java:70)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.gluegen.runtime.NativeLibLoader.loadGlueGenRT(NativeLibLoader.java:68)
    at com.sun.gluegen.runtime.NativeLibrary.ensureNativeLibLoaded(NativeLibrary.java:399)
    at com.sun.gluegen.runtime.NativeLibrary.open(NativeLibrary.java:163)
    at com.sun.gluegen.runtime.NativeLibrary.open(NativeLibrary.java:129)
    at com.sun.opengl.impl.x11.DRIHack.begin(DRIHack.java:109)
    at com.sun.opengl.impl.x11.X11GLDrawableFactory.<clinit>(X11GLDrawableFactory.java:99)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:186)
    at javax.media.opengl.GLDrawableFactory.getFactory(GLDrawableFactory.java:111)
    at javax.media.opengl.GLCanvas.chooseGraphicsConfiguration(GLCanvas.java:520)
    at javax.media.opengl.GLCanvas.<init>(GLCanvas.java:131)
    at javax.media.opengl.GLCanvas.<init>(GLCanvas.java:90)
    at gov.nasa.worldwind.awt.WorldWindowGLCanvas.<init>(Unknown Source)

我可以在 Eclipse 中毫无问题地运行该项目,我在构建路径中引用了 worldwind.jar、jogl.jar、gluegen-rt.jar 和gluegen-rt-natives-linux-amd64.jar 以及本机库.so 文件地点。目前,该项目只是一个显示 WorldWind 地球的 JFrame,如 gov.nasa.worldwindx.examples.SimplestPossibleExample.java 中所示。

我正在尝试构建一个可以在多个操作系统上运行的应用程序。

当我可以在 Eclipse 中毫无问题地运行项目时,我的 jar 无法运行,我做错了什么?

我认为我在使用本机库导出 jar 的过程中遇到了问题,但在 Google 上查找后我找不到解决方案。

我在带有 OpenJDK 的 64 位 Linux 上运行。

谢谢。


编辑 :

我找到了一种使它起作用的解决方法,但不是我想要的方式:

似乎 Eclipse 的“Export Runnable Jar ...”不会以一种在我运行 jar 时使它们可以访问的方式导出 .so 文件,而所需的 .jar 文件包含在导出的 .jar 中并且可以访问。

解决方案是在 jar 旁边的文件夹中包含 .so 文件(Mac 为 .jnilib,Windows 为 .dll)并使用以下命令行启动 jar:java -Xmx512m -Dsun.java2d.noddraw=true -Djava.library.path=./lib -jar MyJAR.jar

-Xmx512m正在增加 java 内存,因为 WorldWind 可能需要比默认数量更多的内存,-Dsun.java2d.noddraw=true可以避免一些显示错误 IIRC。

我制作了一个包含此命令行的 .bash 和一个 .bat 文件。

根据我的发现,只要 .dll 文件与 .jar 位于同一文件夹中,Windows 上似乎不需要设置 lib 位置,尽管在 Linux 上总是需要它。由于我将库放在与 .jar 相同的文件夹中的 lib 文件夹中,因此我需要-Djava.library.path在这两种情况下进行设置。

Linux 所需的库是: libgluegen-rt.so libjogl.so libjogl_awt.so

我在这里找到了那些:http: //download.java.net/media/jogl/builds/archive/

现在导出的 jar 在我的 Lunix 64 位系统上运行良好,我目前正在尝试寻找 Windows 和 Mac 系统来测试它。

如果有人有解决方案来访问 .jar 文件中的 .so 文件,这仍然是受欢迎的。

4

1 回答 1

1

你看过一罐吗?它有一个用于将本机库打包到应用程序 jar 中的系统。

http://one-jar.sourceforge.net/index.php?page=details&file=native

于 2014-08-12T10:38:21.593 回答