sbt-assembly:从一些jar中提取前缀的文件

时间:2014-02-15 02:12:03

标签: scala jar sbt jogl sbt-assembly

在JOGL中,有许多用于不同OS x拱组合的原生jar。如果你不使用java.library.path,JOGL有几个自己的机制来加载正确的机制,并支持一种“胖罐”布局。

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

据我所知,我认为我不想与任何给定的MergeStrategy重复删除,因为只有在发生冲突时才会调用它。每个JOGL的本机库加载器都必须使用布局 - 我想在每个时间调用。有没有一种机制可以让我映射某些jar - > sbt-assembly中的前缀/带/ 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

2 个答案:

答案 0 :(得分:1)

  

据我所知,我认为我不想与任何给定的MergeStrategy重复删除,因为只有在发生冲突时才会调用它。每个JOGL的本机库加载器都必须使用布局 - 我想每次都调用它。

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

默认情况下,申请README和许可证文件的

MergeStrategy.rename每次都会通过附加jar名称来重命名文件。

  

是否有一种机制可以让我映射某些jar - > sbt-assembly中的前缀/带/ path?

没有开箱即用的策略,但您可以定义类似于MergeStrategy.rename的自定义策略。

答案 1 :(得分:0)

按照此规则,Xerxes解释here。然后不再有任何碰撞的风险。 official JogAmp forum是一个更好的地方,可以询问有关所有JogAmp API的问题。如果您不遵循我的建议,GlueGen将无法提取和加载正确的本机库。在您的情况下,natives / linux-amd64是正确的,而natives / linux.and.amd64则不是。