虽然我的应用程序在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)
答案 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)
出现两件事:
我的部分解决方案是将POM配置为在maven-dependency-plugin中使用copy-dependencies,然后使用maven-jar-plugin将类路径重新路由到JAR旁边的lib /目录。