1

在 JOGL 中,有很多用于不同 OS x 架构组合的原生 jar。如果您不使用 java.library.path,JOGL 有几种自己的机制来加载正确的机制,并且支持一种“fat jar”布局。

在胖 jar 布局中,任何原生库都需要位于子目录 ./natives/os.and.arch/ 中。但是,由于本机 jar 本身没有任何内部布局,因此类似命名的 so/dylib/dll 文件会与最终 jar 中的平面层次结构发生冲突。

据我所知,我不认为我想对任何给定的 MergeStrategy 进行重复数据删除,因为只有在发生冲突时才会调用它。对于 JOGL 的本地库加载器,布局是强制性的——我想每次都调用它。是否有一种机制可以让我在 sbt-assembly 中映射某些 jar -> prefix/with/path?

例子

jogl-all-2.1.3-natives-android-armv6.jar 通过依赖项引入。

$ jar -tf jogl-all-2.1.3-natives-linux-amd64.jar
META-INF/MANIFEST.MF
libjogl_mobile.so
libnewt.so

我希望这个放在最后的罐子里:

./natives/
./natives/linux.and.amd64/
./natives/linux.and.amd64/libnewt.so
./natives/linux.and.amd64/libjogl_mobile.so
4

2 回答 2

1

据我所知,我不认为我想对任何给定的 MergeStrategy 进行重复数据删除,因为只有在发生冲突时才会调用它。对于 JOGL 的本地库加载器,布局是强制性的——我想每次都调用它。

每次都会调用所有合并策略。MergeStrategy.deduplicate,这是大多数文件的默认策略,仅在发生冲突时才会生效。

MergeStrategy.rename,例如默认申请README和license文件,每次都会通过追加jar名来重命名文件。

是否有一种机制可以让我在 sbt-assembly 中映射某些 jar -> prefix/with/path?

没有开箱即用的策略可以做到这一点,但您可以定义类似于MergeStrategy.rename.

于 2014-02-15T21:11:03.167 回答
0

只需遵循 Xerxes 解释的这条规则。这样就不再有任何碰撞风险。JogAmp官方论坛是询问有关所有 JogAmp API 问题的更好地方。如果您不听从我的建议,GlueGen 将无法提取和加载正确的本机库。在您的情况下, natives/linux-amd64 是正确的,而 natives/linux.and.amd64 则不是。

于 2014-02-16T17:23:28.023 回答