sbt程序集:重复数据删除module-info.class

时间:2019-02-22 19:45:57

标签: sbt sbt-assembly

组装超级罐子时出现以下错误:

  

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吗?

2 个答案:

答案 0 :(得分:2)

答案取决于您的环境以及您想要实现的目标。

JDK 8

我在使用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

如果将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)
}