scala(jar)库的java着色依赖项
我想分发我创建的一个库的一个罐子,里面捆绑了我的所有依赖项。然而,我希望避免与采用项目的依赖项的版本冲突
我认为maven shade可以做到这一点,但我找不到使用Scala/SBT实现这一点的方法。然而,我在实验中发现OneJar似乎只对可执行文件有效
我怎样才能做到这一点
谢谢
你可以在下面搜索框中键入要查询的问题!
我想分发我创建的一个库的一个罐子,里面捆绑了我的所有依赖项。然而,我希望避免与采用项目的依赖项的版本冲突
我认为maven shade可以做到这一点,但我找不到使用Scala/SBT实现这一点的方法。然而,我在实验中发现OneJar似乎只对可执行文件有效
我怎样才能做到这一点
谢谢
# 1 楼答案
你可以用自己的类加载器来实现
类加载器:
编写一个类加载器,使用重写从不同的类加载器加载类文件
例如,在获取资源时,可以将库作为前缀添加到类路径中
我用这个技术创建了一个类加载器。 https://github.com/espenbrekke/dependent/blob/master/src/main/java/no/dependent/hacks/PathRewritingClassLoader.java
它用添加前缀的方法替换URLClassLoader中的findClass方法
我们还必须重写资源加载
下面是它的用法:
构建你的罐子:
在构建中,将所有库和私有类放置在所选前缀下。在我的gradle构建中,我有一个简单的循环来收集所有依赖项
# 2 楼答案
你试过sbt-assembly插件吗?它有一套在发生冲突时的合并策略,并且有非常好的开始指南
# 3 楼答案
Proguard可以重命名jar中的包并混淆代码。这有点复杂,但你可以用它实现你的目标sbt-proguard插件被积极维护
此外,您还可以查看类似帖子的答案:
maven-shade like plugin for SBT
更新:
从版本
0.14.0
sbt汇编插件看来shading ability