微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

由于StaticLoggerBinder.class中的重复数据删除错误,Scala SBT程序集无法合并

我的问题是我不能再使用sbt-assembly插件了,因为在这个项目的几个人之间徘徊了某种依赖合并问题.

运行’sbt assembly’时的问题:

[error] 3 errors were encountered during merge
java.lang.RuntimeException: deduplicate: different file contents found
in the following:
/Users/aris.vlasakakis/.ivy2/cache/ch.qos.logback/logback-classic/jars/logback-classic-1.1.2.jar:org/slf4j/impl/StaticLoggerBinder.class
/Users/aris.vlasakakis/.ivy2/cache/org.slf4j/slf4j-log4j12/jars/slf4j-log4j12-1.6.1.jar:org/slf4j/impl/StaticLoggerBinder.class
deduplicate: different file contents found in the following:
/Users/aris.vlasakakis/.ivy2/cache/ch.qos.logback/logback-classic/jars/logback-classic-1.1.2.jar:org/slf4j/impl/StaticMDCBinder.class
/Users/aris.vlasakakis/.ivy2/cache/org.slf4j/slf4j-log4j12/jars/slf4j-log4j12-1.6.1.jar:org/slf4j/impl/StaticMDCBinder.class
deduplicate: different file contents found in the following:
/Users/aris.vlasakakis/.ivy2/cache/ch.qos.logback/logback-classic/jars/logback-classic-1.1.2.jar:org/slf4j/impl/StaticmarkerBinder.class
/Users/aris.vlasakakis/.ivy2/cache/org.slf4j/slf4j-log4j12/jars/slf4j-log4j12-1.6.1.jar:org/slf4j/impl/StaticmarkerBinder.class
at sbtassembly.Assembly$.applyStrategies(Assembly.scala:140)
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)
at sbtassembly.Assembly$.inputs$lzycompute$1(Assembly.scala:67)
at sbtassembly.Assembly$.inputs$1(Assembly.scala:57)

… 等等

I am using SBT-assembly 0.13.0,and here is the build.sbt

name := "Metamorphosis"

version := "0.10.0"

scalaVersion := "2.10.4"

lazy val common = RootProject(file("../"))

val main = Project(id = "bridge",base = file(".")).dependsOn(common)

//excludeDependencies += "org.apache.logging.log4j"

resolvers ++= Seq(
//  "Akka Snapshot Repository" at "http://repo.akka.io/snapshots/","Typesafe Releases" at "http://repo.typesafe.com/typesafe/releases/","Sonatype OSS Releases"  at "http://oss.sonatype.org/content/repositories/releases/"
)

libraryDependencies ++= Seq(
  "com.github.nscala-time" %% "nscala-time" % "1.8.0","com.sclasen" %% "akka-kafka" % "0.0.10" % "compile","com.typesafe.akka" %% "akka-actor" % "2.3.2","org.codehaus.groovy" % "groovy" % "2.3.7","com.typesafe.scala-logging" %% "scala-logging-slf4j" % "2.1.2","ch.qos.logback" % "logback-classic" % "1.1.2","ch.qos.logback.contrib" % "logback-json-classic" % "0.1.2","ch.qos.logback.contrib" % "logback-jackson" % "0.1.2","org.slf4j" % "slf4j-api" % "1.7.7","com.fasterxml.jackson.core" % "jackson-databind" % "2.2.2","org.clapper" %% "argot" % "1.0.3","com.typesafe" % "config" % "1.2.1","net.ceedubs" %% "ficus" % "1.0.1","com.typesafe.play" %% "anorm" % "2.3.6","org.json4s" %% "json4s-native" % "3.2.10","org.json4s" %% "json4s-jackson" % "3.2.10","com.github.tototoshi" %% "scala-csv" % "1.1.2","org.scalatest" %% "scalatest" % "2.2.2","junit" % "junit" % "4.11","org.apache.kafka" %% "kafka" % "0.8.1.1"
    exclude("javax.jms","jms")
    exclude("com.sun.jdmk","jmxtools")
    exclude("com.sun.jmx","jmxri")
    exclude("org.slf4j","slf4j-simple")
)

mainClass in assembly := Some("com.company.kafka.agent.MetamorphosisActor")

有关如何解决如何修复此合并问题的任何线索?

谢谢!

解决方法

问题是多个依赖项会导致slf4j传递依赖,从而导致冲突.最好的方法是排除传递依赖,而不是使用SBT程序集的合并策略来解决冲突.

首先,您需要可视化slf4j的来源(适用于所有顶级依赖项).您可以使用此sbt-dependency-graph之类的工具来获取所有依赖项的可视化图表.或者,您可以从SBT命令提示符中探索SBT设置,或使用像this onethis one这样的maven站点.

找到重复的依赖项后,使用与在构建文件中使用的方法相同的方法.只留下单个slf4j传递依赖.您还可以排除所有slf4j传递依赖项(请参阅here how)并在顶层手动添加该slf4j依赖项.

请注意,如果您的依赖项需要多个不同版本的slf4j,那么选择适用于所有情况的单个版本可能会有问题.取决于二进制兼容性.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐