sbt组装错误:重复数据删除:在io.netty.versions.properties

时间:2019-02-11 07:16:11

标签: scala sbt sbt-assembly

我已将以下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)在assemblyMergeStrategy的{​​{1}}中添加了这一行:build.sbt(尝试过case PathList("io", "netty", xs @ _*) => MergeStrategy.discard.last

2)在{{1}中的.first中添加了这一行:assemblyMergeStrategy(尝试过build.sbtcase "META-INF\\io.netty.versions.properties" =>MergeStrategy.first

3)为排除依赖项中出现错误的净值罐添加了SBT排除规则,如下所示:

.last

以及上述的许多此类变体。这些解决方案均无法正常工作。

.discard如下所示:

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

请告知。

5 个答案:

答案 0 :(得分:1)

您可以尝试以下操作:

<table class="table table-responsive table-stripped table-collapsed table-bordered">
    <tr th:each="rows, rowStat : ${lists}">
        <td th:text="${rowStat.count}"></td>
        <td th:each="value: ${rows}" th:text="${value}"></td>
    </tr>
</table>

或在最坏的情况下

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


答案 1 :(得分:0)

如果检查文件的内容,则可以看到每个jar中都有不同的值,因此要正确执行程序集中的连接,可以合并这些文件以保留其中的所有属性。使用case "META-INF/io.netty.versions.properties" => MergeStrategy.concat作为策略。

答案 2 :(得分:0)

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

它包含以下变通办法可以为我解决问题:

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

我可以想象这对于需要最新版本的用户不起作用,但这至少是一些东西。

答案 3 :(得分:0)

由于多个版本的可用性,我认为您遇到此错误。要摆脱这种情况,您可以在build.sbt中尝试以下代码片段,然后尝试。

assemblyShadeRules装配中:= Seq(ShadeRule.rename(“ shapeless。**”->“ new_shapeless。@ 1”)。inAll)

答案 4 :(得分:0)

我在 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 下的文件,而不是 versions.properties 下名为 io/netty 的文件。所以这个与预期的文件不匹配:
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。这不能解决问题。