2014-09-06 94 views
0

我已经写了一个使用opengl的程序,我已经在eclipse中没有问题的情况下运行了,现在我想把它打包成一个jar来部署。从罐子里运行opengl jogamp

我正在使用maven来管理所有的依赖和构建过程。我已经做了一个清理和打包来构建一个具有所有必要依赖项的jar,但是我很难让它实际运行。

它似乎在寻找jar文件以外的文件,例如gluegen-rt.dll,我可以看到它位于顶层jar文件中。它似乎也正在尝试引用我的jar版本,并在名称后面加上'-natives-windows-amd64'。

当我尝试运行它,我得到以下错误:

D:\My Documents\workspace\Cube\target>java -jar cube-0.0.1-SNAPSHOT-jar-with-dependencies.jar 10 OPENGL 
Catched FileNotFoundException: D:\My Documents\workspace\Cube\target\cube-0.0.1-SNAPSHOT-jar-with-dependencies-natives-windows-amd64.jar (The system cannot find the file specified), while addNativeJarLibsImpl(classFromJavaJar class com.jogamp.common.os.Platform, classJarURI jar:file:/D:/My%20Documents/workspace/Cube/target/cube-0.0.1-SNAPSHOT-jar-with-dependencies.jar!/com/jogamp/common/os/Platform.class, nativeJarBaseName 
cube-0.0.1-SNAPSHOT-jar-with-dependencies-natives-windows-amd64.jar): [ file:/D:/My%20Documents/workspace/Cube/target/cube-0.0.1-SNAPSHOT-jar-with-dependencies.jar -> file:/D:/My%20Documents/workspace/Cube/target/ ] + cube-0.0.1-SNAPSHOT-jar-with-dependencies-natives-windows-amd64.jar -> slim: jar:file:/D:/My%2520Documents/workspace/Cube/target/cube-0.0.1-SNAPSHOT-jar-with-dependencies-natives-windows-amd64.jar!/ 
Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library: D:\My Documents\workspace\Cube\target\gluegen-rt.dll 
     at java.lang.ClassLoader.loadLibrary(Unknown Source) 
     at java.lang.Runtime.load0(Unknown Source) 
     at java.lang.System.load(Unknown Source) 
     at com.jogamp.common.jvm.JNILibLoaderBase.loadLibraryInternal(JNILibLoaderBase.java:551) 
     at com.jogamp.common.jvm.JNILibLoaderBase.access$000(JNILibLoaderBase.java:64) 
     at com.jogamp.common.jvm.JNILibLoaderBase$DefaultAction.loadLibrary(JNILibLoaderBase.java:96) 
     at com.jogamp.common.jvm.JNILibLoaderBase.loadLibrary(JNILibLoaderBase.java:414) 
     at com.jogamp.common.os.DynamicLibraryBundle$GlueJNILibLoader.loadLibrary(DynamicLibraryBundle.java:388) 
     at com.jogamp.common.os.Platform$1.run(Platform.java:209) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at com.jogamp.common.os.Platform.<clinit>(Platform.java:179) 
     at javax.media.opengl.GLProfile.<clinit>(GLProfile.java:83) 
     at ui.jogl.JOGLCube.init(JOGLCube.java:52) 
     at ui.jogl.JOGLCube.<init>(JOGLCube.java:44) 
     at ui.jogl.JOGLCubeController.<init>(JOGLCubeController.java:19) 
     at core.Cube.getVirtualCube(Cube.java:37) 
     at core.Cube.<init>(Cube.java:27) 
     at core.Cube.main(Cube.java:56) 

我与OpenGL的工作没有现成的经验,因此任何帮助,将不胜感激。

感谢您的阅读

回答

1

您将无法将您的应用程序放在一个jar中。 JOGL是一个非常复杂的几个jar包(也可能是dll),它们必须与应用程序jar正确安装在相同的文件夹中。

我不知道如何在Eclipse中设置它(我的经验是Netbeans,IMO是一个更强大的构建环境),但问题在于JOGL本地部分的DLL未找到。 JOGL使用一个稍微疯狂的方法:DLL被打包成jar文件,并且库在运行时动态扩展它们,然后附加它们。这个文件的名称是jogl-all-natives-windows-amd64.jar。一般来说,您应该将所有这些名称形式为jogl-all-natives-*.jar的罐子放在与应用程序jar文件相同的目录中。

上面的问题是,您的应用程序的用户必须在可以加载DLL的位置具有写权限。这可能与许多企业安全策略相冲突(例如通过Active Directory推送实施)。如果您的用户人口众多,这对于足够的用户来说不会造成严重的痛苦。我一直在努力的应用程序必须在国际学校运行。无法使用所有功能于一身的JAR机制。

另一种方式是使用jogamp发行版的lib文件夹中的独立本机DLL,将它们放在应用程序的java.library.path上的lib目录中。

在任何情况下,您都需要安装程序将多个JAR,DLL以及系统的其他文件放在正确的位置。我为此使用NSIS。它不像商业安装程序构建器那样精致,但它足以完成多jar Java应用程序安装程序。如果您想查看我的JOGL应用程序处理Windows和Mac安装的方式,请参阅Bridge Designer and Contest

最后需要注意的是,如果您无法完全控制应用程序部署的计算机,那么可以考虑在安装程序中打包Java运行时。处理gajillipon用户可以忽略java安装的方式并不多。内置的JRE使下载软件包变得更大,但根据我的经验,这比处理用户机器上的内容的替代方案造成的痛苦少得多。

此信息(尽管格式不太可读)记录在the JOGL deployment Wiki上。

+0

我们的方法并不疯狂,SWT和LibGDX做类似的事情,它是可选的,它可以被禁用。当它仍然启用时,如果目录出现问题,可能是由于最近修复了一个问题,导致GlueGen无法在某些特定情况下在Windows下创建临时目录。否则,请随时提出改进请求以允许开发人员通过自定义目录来存储本地库,这将比您的建议容易得多。 – gouessej 2014-09-07 11:30:52

1

我这样做是为了我的游戏(Truly Unusual Experience ofRevolution®)。目前支持。请看看维基的这个页面: http://jogamp.org/wiki/index.php/JogAmp_JAR_File_Handling

你必须遵循一定的布局,让GlueGen找到你的本地库JOGL,JOAL和JOCL: http://forum.jogamp.org/Packaging-JOGL-projects-to-be-cross-platform-tp4031261p4031286.html

如果你的项目是GPL下,请随时在我的Ant构建脚本中查看我的Ant目标“create-jars”: http://svn.code.sf.net/p/tuer/code/pre_beta/build.xml

您不需要设置Java库路径,不需要使用DLL,只需使用包含Java库和包含本机库的JAR。

请记住,双击它而不是运行应用程序时,defaut归档器(Ark,WinRAR,...)可能会打开您的JAR。我建议你将你的JAR封装到本地应用程序包中。您可以使用Packr,Launch4j或NSIS来执行此操作。我上面的脚本使用我的Ant目标“创建应用程序”(启发于Packr,仍然使用其本机启动器)为Mac OS X创建一个.app压缩文件。祝你好运。

P.S:如果您因使用GPL而感到“困扰”,您可以参阅我的教程JogAmp's Ardor3D Continuation来处理这方面的问题。