组装超级罐子时出现以下错误:
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吗?
答案 0 :(得分:2)
答案取决于您的环境以及您想要实现的目标。
我在使用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)
}
这只是丢弃文件。
如果将JDK 11与最终用户项目(而不是库)一起使用,则它也应该是安全的,就像创建uber-jar一样,所有类都包括在内,并且不需要外部依赖项。只是通过简短测试对其进行了测试(还不足以说它始终是安全的。)
如果您使用JDK 11并创建一个库,那么最好不要创建一个uber-jar。在这种情况下,放下module-info.class
很可能会创建一个无法使用的jar。在这种情况下,只需依赖库即可。
答案 1 :(得分:0)
module-info.clas
文件已在许多库中移动。
这是更新的解决方案
ThisBuild / assemblyMergeStrategy := {
case PathList("module-info.class") => MergeStrategy.discard
case x if x.endsWith("/module-info.class") => MergeStrategy.discard
case x =>
val oldStrategy = (ThisBuild / assemblyMergeStrategy).value
oldStrategy(x)
}