Scala sbt程序集:为从某些JAR提取的文件添加前缀

Scala sbt程序集:为从某些JAR提取的文件添加前缀,scala,jar,sbt,jogl,sbt-assembly,Scala,Jar,Sbt,Jogl,Sbt Assembly,在JOGL中,有许多用于不同OS x arch组合的本机JAR。如果您不使用java.library.path,JOGL有几个自己的机制来加载正确的机制,并且支持一种“胖jar”布局 在fat jar布局中,任何本机库都需要位于子目录中。/natives/os.and.arch/。然而,由于本机jar本身没有任何内部布局,因此类似命名的so/dylib/dll文件会在最终jar中碰撞平面层次结构 据我所知,我不想使用任何给定的MergeStrategy进行重复数据消除,因为只有在发生冲突时才会调

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

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

据我所知,我不想使用任何给定的MergeStrategy进行重复数据消除,因为只有在发生冲突时才会调用它。对于JOGL的本机库加载器,布局是必需的-我希望每次都调用它。是否有一种机制允许我在sbt程序集中映射某些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
据我所知,我不想使用任何给定的MergeStrategy进行重复数据消除,因为只有在发生冲突时才会调用它。对于JOGL的本机库加载器,布局是必需的-我希望每次都调用它

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

MergeStrategy.rename
,例如,默认情况下应用于自述文件和许可证文件,每次都会通过附加jar名称来重命名文件

是否有一种机制允许我在sbt程序集中映射某些jar->prefix/with/path


没有现成的策略可以做到这一点,但您可以定义类似于
MergeStrategy的自定义策略。重命名

只需按照Xerxes解释的规则操作即可。这样就不再有任何碰撞的危险。是询问所有JogAmp API问题的更好地方。如果不遵循我的建议,GlueGen将无法提取和加载正确的本机库。在您的例子中,natives/linux-amd64是正确的,而natives/linux.and.amd64不是正确的。

看起来我错过了一个关于函数sourceofileformerge的附带说明,该函数可用于确定文件来自哪个jar。我已经找到了答案。我跳过了Readme.md中关于自定义合并策略的评论。对我来说,关键是包含的sbtasemply.AssemblyUtils.sourceOfFileForMerge。由此,我可以确定它是哪个本机jar,并相应地设置输出路径。就像你说的,它类似于MergeStrategy.rename,我只是在前面加上了其他的前缀。