sbt程序集:重复数据消除模块-info.class
组装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/jaxbapi/jars/jaxb-api-2.3.1.jar:module-info.class 我不是最新的java技术,但假设我不能简单地丢弃其中一个类sbt程序集:重复数据消除模块-info.class,sbt,sbt-assembly,Sbt,Sbt Assembly,组装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/jaxbapi/jars/j
有人能告诉我可以使用什么合并策略来安全编译uber jar吗?答案取决于您的环境和您想要实现的目标 JDK 8 我在使用JDK 8的项目中遇到了同样的问题。JDK 8不使用文件
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
如果将JDK 11用于最终用户项目(而不是库),那么它也应该是安全的,就像创建uber jar一样,所有类都包括在内,不需要外部依赖项。只是做了一个简短的测试(不够彻底,不能说它总是安全的)
如果您使用JDK11并创建一个库,那么最好不要创建uber jar。在这种情况下,删除
模块info.class
很可能会创建一个无法工作的jar。在这种情况下,只需依赖于库。模块信息.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)
}
由于文件已移动到
META-INF/versions/9
,我不得不将discard case更改为case x if x.endsWith(“/module info.class”)
。