我正在使用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 文件,这仍然是受欢迎的。