sbt程序集:重复数据消除模块-info.class

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时,我遇到以下错误:

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技术,但假设我不能简单地丢弃其中一个类


有人能告诉我可以使用什么合并策略来安全编译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”)