2014-02-13 107 views
2

我正在嘗試爲我的項目創建一個可執行的jar,使用JOGL。以前沒有JOGL,使用maven-assembly-plugin很容易。我在我的應用程序POM如下:使用帶JOGL的maven assembly插件創建可執行的jar

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <configuration> 
    <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
    </descriptorRefs> 
    <archive> 
     <manifest> 
      <mainClass>org.jbox2d.testbed.framework.jogl.JoglTestbedMain</mainClass> 
     </manifest> 
    </archive> 
</configuration> 

在非JOGL項目這會產生一個很好的jbox2d-testbed-2.2.1.2-SNAPSHOT-jar-with-dependencies是可執行文件(用不同的主類在裏面,當然)。

JOGL項目在Eclipse中使用mavin插件運行得很好,我包含了如描述的here in the wiki所述的jogl依賴項。然而,當我用在這個項目上裝配插件並啓動jbox2d-testbed-jogl-1.0.2-SNAPSHOT-jar-with-dependencies.jar我收到以下錯誤:

Catched FileNotFoundException: /Users/dmurph/Projects/jbox2d/jbox2d-testbed-jogl/target/jbox2d-testbed-jogl-1.0.2-SNAPSHOT-jar-with-dependencies-natives-macosx-universal.jar (No such file or directory), while addNativeJarLibsImpl(classFromJavaJar class com.jogamp.common.os.Platform, classJarURI jar:file:/Users/dmurph/Projects/jbox2d/jbox2d-testbed-jogl/target/jbox2d-testbed-jogl-1.0.2-SNAPSHOT-jar-with-dependencies.jar!/com/jogamp/common/os/Platform.class, nativeJarBaseName jbox2d-testbed-jogl-1.0.2-SNAPSHOT-jar-with-dependencies-natives-macosx-universal.jar): [ file:/Users/dmurph/Projects/jbox2d/jbox2d-testbed-jogl/target/jbox2d-testbed-jogl-1.0.2-SNAPSHOT-jar-with-dependencies.jar -> file:/Users/dmurph/Projects/jbox2d/jbox2d-testbed-jogl/target/ ] + jbox2d-testbed-jogl-1.0.2-SNAPSHOT-jar-with-dependencies-natives-macosx-universal.jar -> slim: jar:file:/Users/dmurph/Projects/jbox2d/jbox2d-testbed-jogl/target/jbox2d-testbed-jogl-1.0.2-SNAPSHOT-jar-with-dependencies-natives-macosx-universal.jar!/ 
Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library: /System/Library/Frameworks/gluegen-rt.Framework/gluegen-rt 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1854) 
    at java.lang.Runtime.load0(Runtime.java:795) 
    at java.lang.System.load(System.java:1062) 
    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:203) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.jogamp.common.os.Platform.<clinit>(Platform.java:173) 
    at javax.media.opengl.GLProfile.<clinit>(GLProfile.java:82) 
    at org.jbox2d.testbed.framework.jogl.JoglPanel.<init>(JoglPanel.java:52) 
    at org.jbox2d.testbed.framework.jogl.JoglTestbedMain.main(JoglTestbedMain.java:62) 

當我解壓罐子,我看到所有的需要的dll和JOGL jnilib庫,所以有我需要做些額外的事情才能實現這個目標?我知道JOGL使用單獨的jar系統,我是否需要更改程序集插件的行爲,以便它可以正確生成額外的jar文件?

你可以抓住我的項目,並嘗試一下,如果你喜歡,它在https://github.com/dmurph/jbox2d

謝謝!

回答

0

你必須遵循一個精確的語義規則,使其工作,使GlueGen能夠JAR文件中查找本地庫,提取它們並加載它們: http://forum.jogamp.org/Packaging-JOGL-projects-to-be-cross-platform-tp4031261p4031286.html

+0

在Maven中有這樣做的方法嗎? – CJxD

+1

如上所述,使用程序集插件和自定義裝配描述符。這會給你控制你需要將本地庫放在正確的位置。 – JBCP

+1

@JBCP謝謝。我應該把這種信息放入維基或用戶指南中。 – gouessej

1

按照JOGL FAQ,你需要將你的本地庫放在fat jar中的特定位置。看起來你是在Mac上,所以你需要把你的本機庫這個目錄在您的罐子

natives/macosx-universal/ 

正如@gouessej,here is a complete list of supported architectures and required directories提及。

我想你需要創建一個自定義Assembly Descriptor

https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html 

編寫自己的描述符將允許你把罐子在特定的位置,以獲得您所需要的包裝。

+0

我試過這種方法把JOGL和Gluegen jar放入目標jar的根目錄,但JOGL仍然抱怨說它無法加載本地組件。你能給出明確的說明,將與JOGL一起工作嗎? – CJxD

+0

我已經更新了我的答案。您需要將本機庫(.so文件等)放入jar中的'natives/macosx-universal /'目錄中。所有的罐子和其他東西都可以去往他們通常去的地方。這應該是你需要做的一切。 – JBCP

+0

我已經這樣做了,但JOGL的JNI加載器仍然無法找到本機。另外,至少我發現了一種純粹的maven方式,將原生目錄以正確的格式包含到JAR中。 – CJxD

相關問題