【发布时间】:2014-03-06 02:56:24
【问题描述】:
虽然我的应用程序在 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 的本地库解包。它正在将“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)
【问题讨论】:
-
好吧,据我所知,直接从 JAR 中使用本机库是不可能的,它必须被提取到目标系统中的文件系统并从那里加载。在这种情况下,有一个 maven-nar-plugin 旨在简化包装
-
你是对的;我完全忘记了。它开始看起来像 JOGL 没有将库卸载到临时或临时位置没有被添加到库路径。
标签: java maven jar jogl unsatisfiedlinkerror