【问题标题】:sbt assembly: deduplicate module-info.classsbt 程序集:去重 module-info.class
【发布时间】:2019-07-16 23:07:25
【问题描述】:

组装我的 uber jar 时出现以下错误:

java.lang.RuntimeException: deduplicate: 发现不同的文件内容 在以下内容中:[错误] /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 技术,但假设我不能简单地丢弃这些类之一。

谁能告诉我可以使用什么 mergeStrategy 来安全地编译 uber jar?

【问题讨论】:

    标签: sbt sbt-assembly


    【解决方案1】:

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

    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 时包含所有类并且不需要外部依赖项一样。只是用一个简短的测试对其进行了测试(不够彻底,不能说它总是安全的)。

    如果您使用 JDK 11 并创建库,那么最好不要创建 uber-jar。在这种情况下,删除 module-info.class 很可能会创建一个不起作用的 jar。在这种情况下,只需依赖库即可。

    【讨论】:

    • 由于文件已移至META-INF/versions/9,我不得不将丢弃大小写更改为case x if x.endsWith("/module-info.class")
    【解决方案2】:

    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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      • 2021-08-18
      • 2021-05-06
      • 2016-09-02
      • 2019-09-27
      相关资源
      最近更新 更多