组装uber jar时出现以下错误:
java.lang.RuntimeException:重复数据删除:在以下文件中发现了不同的文件内容:[错误] /Users/jake.stone/.ivy2/cache/org.bouncycastle/bcprov-jdk15on/jars/bcprov-jdk15on-1.61.jar:module -info.class [错误] /Users/jake.stone/.ivy2/cache/javax.xml.bind/jaxb-api/jars/jaxb-api-2.3.1.jar:module-info.class
我不了解Java技术,但是假设我不能简单地丢弃这些类之一。
有人可以告诉我我可以用来安全地编译uber jar的mergeStrategy吗?
Uwe*_*nus 10
答案取决于您的环境以及您想要实现的目标。
我在使用JDK 8的项目中遇到了相同的问题。JDK8不使用该文件,module-info.class因此可以安全地丢弃该文件。
将以下内容添加到您的build.sbt:
assemblyMergeStrategy in assembly := {
case "module-info.class" => MergeStrategy.discard
case x =>
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
}
Run Code Online (Sandbox Code Playgroud)
这只是丢弃文件。
如果将JDK 11与最终用户项目(而不是库)一起使用,则它也应该是安全的,就像创建uber-jar一样,所有类都包括在内,并且不需要外部依赖项。只是通过简短测试对其进行了测试(还不足以说它总是安全的)。
如果使用JDK 11并创建一个库,则最好不要创建uber-jar。在这种情况下,丢弃module-info.class遗嘱很可能会创建无法使用的罐子。在这种情况下,仅依赖于库。
该module-info.class文件已移至许多图书馆。这是更新的解决方案
assembly / assemblyMergeStrategy := {
case PathList("module-info.class") => MergeStrategy.last
case path if path.endsWith("/module-info.class") => MergeStrategy.last
case x =>
val oldStrategy = (assembly / assemblyMergeStrategy).value
oldStrategy(x)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
529 次 |
| 最近记录: |