从Maven着色.jar执行时错误的库路径

时间:2014-03-06 02:56:25

标签: java maven jar jogl nativelibrary

虽然我的应用程序在Eclipse中运行良好,但是当使用Maven着色插件并“运行”JAR时,我得到一个异常,说明在当前工作目录中找不到所需的JOGL二进制库,这是正确的,因为它不在当前的工作目录,但是在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的本机lib解包。它将“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)

2 个答案:

答案 0 :(得分:1)

这里记录了JOGL本机lib加载:
https://jogamp.org/wiki/index.php/JogAmp_JAR_File_Handling

使用maven shade-plugin工作获得单片/ Fat-Jar的一种简单方法是从lib文件夹中提取本机库(例如从 http://jogamp.org/deployment/jogamp-current/archive/jogamp-all-platforms.7z) 并将它们放入maven项目的src/main/resources/natives文件夹中。 这样,库最终会出现在Fat-Jar的natives子文件夹中as described

答案 1 :(得分:0)

出现两件事:

  • JOGL对JAR中的本地库的库JAR名称和位置很挑剔。 JOGL仍然认为它是从它自己的JAR运行而不是单片JAR,导致它寻找不正确的名称和位置,以便将其文件加载到temp。
  • JOGL在各种JAR中有许多相同名称和路径的本机lib文件。当这些得到整合后,就会导致名称冲突,大多数文件甚至都不存在。

我的部分解决方案是将POM配置为在maven-dependency-plugin中使用copy-dependencies,然后使用maven-jar-plugin将类路径重新路由到JAR旁边的lib /目录。