【问题标题】:Wrong library path when executing from Maven shaded .jar从 Maven 阴影 .jar 执行时库路径错误
【发布时间】: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


【解决方案1】:

JOGL 原生库加载记录在此:
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 as described 中的 natives 子文件夹中@

【讨论】:

  • 这意味着您不能再使用 Maven 来管理 JOGL 依赖项,因为您正在绕过它并手动执行它。
  • 真的,不漂亮
【解决方案2】:

出了两件事:

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

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

【讨论】:

  • JOGL 并不挑剔,您必须遵循正确的规则,让 GlueGen 有机会找到包含本机库的 JAR,以便提取并加载它们。遵循这条规则(我们已经在官方论坛上讨论了很多)可以避免任何“名称冲突”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 2023-03-12
  • 2021-05-01
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
相关资源
最近更新 更多