2014-03-06 24 views
3

儘管我的應用程序可以在Eclipse中正常工作,但在使用Maven着色插件和'運行JAR時,我得到一個異常,說明無法找到所需的JOGL二進制庫當前工作目錄,因爲它不在當前工作目錄中,而是在JAR本身的根目錄中。錯誤的庫路徑從Maven執行時着色.jar

Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library: /path/to/working/dir/libgluegen-rt.so

我已確認該文件存在於JAR的根如預期。

我POM的插件調用:

<plugin> 
<groupId>org.apache.maven.plugins</groupId> 
<artifactId>maven-shade-plugin</artifactId> 
<version>2.1</version> 
    <executions> 
<execution> 
<phase>package</phase> 
<goals> 
    <goal>shade</goal> 
</goals> 
<configuration> 
    <shadedArtifactAttached>true</shadedArtifactAttached> 
<shadedClassifierName>RunMe</shadedClassifierName> 
<transformers> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
    <mainClass>path.confirmed.to.work.RunMe</mainClass> 
    </transformer> 
</transformers> 
</configuration> 
</execution> 
</executions> 
</plugin> 

清單我的JAR:

Manifest-Version: 1.0 
Build-Jdk: 1.6.0_30 
Built-By: me 
Created-By: Apache Maven 
Main-Class: path.confirmed.to.work.RunMe 
Archiver-Version: Plexus Archiver 

想法?建議?

更新:看起來陰影插件混淆JOGL的本地庫解壓縮。這是增加的「linux-amd64來我的JAR的名稱的末尾,認爲這是JOGL,只有庫JAR

Catched FileNotFoundException: /path/to/my/git/project/target/0.0.1-SNAPSHOT-RunMe-natives-linux-amd64.jar (No such file or directory), while TempJarCache.bootstrapNativeLib() of jar:file:/path/to/my/git/project/terminal-recall/target/trcl-0.0.1-SNAPSHOT-RunMe-natives-linux-amd64.jar!/ (file:/path/to/my/git/project/target/ + trcl-0.0.1-SNAPSHOT-RunMe-natives-linux-amd64.jar) 
+0

那麼,據我所知,不可能從JAR直接使用本地庫,它必須被提取到文件系統中目標系統並從那裏加載。這裏有maven-nar-plugin,旨在簡化包裝 – user3159253

+0

你是對的;我完全忘了。它開始看起來像JOGL不會將庫卸載到temp或臨時位置未被添加到lib路徑。 – user515655

回答

0

兩個事情發生了錯誤:

  • JOGL是挑剔庫JAR JGL中的本地庫的名稱和位置JOGL仍然認爲它是從它自己的JAR運行而不是單獨的JAR,導致它查找不正確的名稱和位置以使其文件加載到temp中
  • JOGL有許多在各種JAR中具有相同名稱和路徑的本機lib文件。當這些文件得到整合時,它們會導致名稱衝突和大部分文件最終甚至不在那裏。

我的部分解決方案是配置爲使用拷貝依賴於Maven的依賴,插件,然後使用maven-JAR-插件重新路由類路徑的lib /目錄旁邊的JAR的POM。

+0

JOGL不挑剔,你必須遵循正確的規則,給GlueGen一個機會來找到包含本地庫的JAR,以便它可以提取它們並加載它們。遵循這個規則(我們已經在我們的官方論壇上討論了很多關於這個規則)可以避免任何「名稱衝突」。 – gouessej

1

JOGL本地庫裝載記錄在這裏:
https://jogamp.org/wiki/index.php/JogAmp_JAR_File_Handling

一種簡單的方式來獲得單片/脂肪-JAR使用Maven樹蔭插件的工作,是從lib文件夾中提取的原生庫(如從 http://jogamp.org/deployment/jogamp-current/archive/jogamp-all-platforms.7z) 並將它們放到您的maven項目的src/main/resources/natives文件夾中。 這樣庫最終在你的Fat-Jar中的一個natives子文件夾中as described

+2

這意味着您不能再使用Maven來管理JOGL依賴項,因爲您正在繞過該操作並手動執行該操作。 – CJxD

+0

是真的,它不漂亮 – mwohlf