【问题标题】:sbt assembly error:deduplicate: different file contents found in io.netty.versions.propertiessbt 程序集错误:重复:在 io.netty.versions.properties 中找到不同的文件内容
【发布时间】:2019-07-04 15:40:25
【问题描述】:

我已将以下 jar 添加到 build.sbt 文件中,如下所示:

"com.amazonaws" % "aws-java-sdk" % "1.11.492"

发布这个,在合并期间,我收到以下错误:

 [error] 1 error was encountered during merge
java.lang.RuntimeException: deduplicate: different file contents found in the following:
/home/jenkins-slave/.ivy2/cache/io.netty/netty-codec-http/jars/netty-codec-http-4.1.17.Final.jar:META-INF/io.netty.versions.properties
/home/jenkins-slave/.ivy2/cache/io.netty/netty-handler/jars/netty-handler-4.1.17.Final.jar:META-INF/io.netty.versions.properties
/home/jenkins-slave/.ivy2/cache/io.netty/netty-codec/jars/netty-codec-4.1.17.Final.jar:META-INF/io.netty.versions.properties
/home/jenkins-slave/.ivy2/cache/io.netty/netty-transport/jars/netty-transport-4.1.17.Final.jar:META-INF/io.netty.versions.properties
/home/jenkins-slave/.ivy2/cache/io.netty/netty-resolver/jars/netty-resolver-4.1.17.Final.jar:META-INF/io.netty.versions.properties
/home/jenkins-slave/.ivy2/cache/io.netty/netty-buffer/jars/netty-buffer-4.1.17.Final.jar:META-INF/io.netty.versions.properties
/home/jenkins-slave/.ivy2/cache/io.netty/netty-common/jars/netty-common-4.1.17.Final.jar:META-INF/io.netty.versions.properties
    at sbtassembly.Assembly$.applyStrategies(Assembly.scala:143)
    at sbtassembly.Assembly$.x$1$lzycompute$1(Assembly.scala:25)
    at sbtassembly.Assembly$.x$1$1(Assembly.scala:23)
    at sbtassembly.Assembly$.stratMapping$lzycompute$1(Assembly.scala:23)
    at sbtassembly.Assembly$.stratMapping$1(Assembly.scala:23)...........

我已经尝试了许多为此提供的解决方法,例如:

1) 在build.sbt:case PathList("io", "netty", xs @ _*) => MergeStrategy.discardassemblyMergeStrategy 中添加了这一行(尝试使用.last.first

2)在build.sbt:case "META-INF\\io.netty.versions.properties" =>MergeStrategy.firstassemblyMergeStrategy 中添加了这一行(尝试使用.last.discard

3)在excludedDependencies中为出错的netty jar添加了SBT排除规则,如下所示:

    excludeDependencies ++= Seq(
      SbtExclusionRule("io.netty", "netty-codec-http"),
      SbtExclusionRule("io.netty", "netty-codec"),
      SbtExclusionRule("io.netty", "netty-handler"),
      SbtExclusionRule("io.netty", "netty-transport"),
      SbtExclusionRule("io.netty", "netty-resolver"),
      SbtExclusionRule("io.netty", "netty-buffer"),
      SbtExclusionRule("io.netty", "netty-common")
    )

以及上述的许多此类变体。这些解决方案都不起作用。

plugins.sbt 如下所示:

addSbtPlugin("io.spray" % "sbt-revolver" % "0.7.2")

addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.5.0")

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.9")

addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.0.1")

addSbtPlugin("com.scalapenos" % "sbt-prompt" % "0.2.1")

addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.1.10")

addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.8.0")

addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")

请多多指教。

【问题讨论】:

  • 你试过"com.amazonaws" % "aws-java-sdk" % "1.11.492" excludeAll ExclusionRule(organization = "io.netty")吗?在我们的构建中它是case "META-INF/io.netty.versions.properties" => MergeStrategy.first btw
  • 谢谢@ariskk,我试过了,效果很好!!!

标签: scala sbt sbt-assembly


【解决方案1】:

你可以试试下面的:

assemblyMergeStrategy in assembly := {
      case x if x.contains("io.netty.versions.properties") => MergeStrategy.discard
      case x =>
        val oldStrategy = (assemblyMergeStrategy in assembly).value
        oldStrategy(x)
}


或者在最坏的情况下

case x if x.contains("versions.properties") => MergeStrategy.discard

【讨论】:

    【解决方案2】:

    如果您检查文件的内容,您会发现每个 jar 中都有不同的值,因此要在程序集中正确地连接这些文件以保留其中的所有属性。使用case "META-INF/io.netty.versions.properties" => MergeStrategy.concat它的策略。

    【讨论】:

      【解决方案3】:

      在搜索问题的解决方案后,我在sbt-assembly 存储库中找到了this issue

      它包含为我解决问题的以下解决方法:

      当外部依赖项被替换为较早版本的 aws 库 "com.amazonaws" % "aws-java-sdk" % "1.11.80" 时,它可以工作,因为该库不包含 META-INF/io.netty.versions.properties 的任何重复项。

      我可以想象这不适用于需要最后一个版本的人,但这至少是一些东西。

      【讨论】:

        【解决方案4】:

        我认为您收到此错误是因为有多个版本可用。要摆脱这种情况,您可以在 build.sbt 中尝试以下 sn-p 并尝试。

        程序集中的assemblyShadeRules := Seq(ShadeRule.rename("shapeless.**" -> "new_shapeless.@1").inAll)

        【讨论】:

          【解决方案5】:

          我在 windows 上也遇到过同样的问题,发现解决办法应该是:

          case PathList("META-INF", "io.netty.versions.properties") => MergeStrategy.first
          

          或将其放在 assemblyMergeStrategy 设置中,它将是:

          assembly / assemblyMergeStrategy := {
            case PathList("META-INF", "io.netty.versions.properties") => MergeStrategy.first
            case x =>
              val oldStrategy = (assembly / assemblyMergeStrategy).value
              oldStrategy(x)
          }
          

          我认为问题中提到的解决方法不起作用的原因是:

          1. io.netty.versions.propertiesMETA-INF 下的文件,而不是io/netty 下名为versions.properties 的文件。所以这个与预期的文件不匹配:
          case PathList("io", "netty", xs @ _*) => MergeStrategy.discard
          
          1. 我认为第二个不起作用的原因是因为我们需要使用PathList 来匹配某些文件夹下的路径,而不是使用问题中显示的斜杠(带有反斜杠):
          case "META-INF\\io.netty.versions.properties" =>MergeStrategy.first
          

          当我第一次遇到这个问题时,我使用的是正斜杠,它也不起作用:

          case "META-INF/io.netty.versions.properties" =>MergeStrategy.first
          
          1. 我认为aws-java-sdk 工作需要netty 依赖项。因此,将它们从依赖项中排除将使我们得到ClassNotFoundException。这不会解决问题。

          【讨论】:

            猜你喜欢
            • 2019-09-12
            • 2018-10-04
            • 2014-06-10
            • 2021-02-27
            • 2016-03-22
            • 2015-08-07
            • 2016-03-16
            • 2017-10-18
            • 1970-01-01
            相关资源
            最近更新 更多