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

Jak*_*ke 7 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/jaxb-api/jars/jaxb-api-2.3.1.jar:module-info.class

我不了解Java技术,但是假设我不能简单地丢弃这些类之一。

有人可以告诉我我可以用来安全地编译uber jar的mergeStrategy吗?

Uwe*_*nus 10

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

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)
}
Run Code Online (Sandbox Code Playgroud)

这只是丢弃文件。

JDK 11

如果将JDK 11与最终用户项目(而不是库)一起使用,则它也应该是安全的,就像创建uber-jar一样,所有类都包括在内,并且不需要外部依赖项。只是通过简短测试对其进行了测试(还不足以说它总是安全的)。

如果使用JDK 11并创建一个库,则最好不要创建uber-jar。在这种情况下,丢弃module-info.class遗嘱很可能会创建无法使用的罐子。在这种情况下,仅依赖于库。

  • 由于文件已移至“META-INF/versions/9”,我必须将丢弃大小写更改为“case x if x.endsWith("/module-info.class")`。 (7认同)

hag*_*gai 7

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)