【问题标题】:SBT Assembly - DeduplicateSBT 程序集 - 去重
【发布时间】:2016-08-10 03:49:07
【问题描述】:

我得到了以下 SBT 文件:

.
-- root
     -- plugins.sbt
-- build.sbt

plugins.sbt 包含以下内容:

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

build.sbt 包含以下内容:

import sbt.Keys._

resolvers in ThisBuild ++= Seq("Apache Development Snapshot Repository" at "https://repository.apache.org/content/repositories/snapshots/", Resolver.sonatypeRepo("public"))

name := "flink-experiment"

lazy val commonSettings = Seq(
    organization := "my.organisation",
    version := "0.1.0-SNAPSHOT"
)

val flinkVersion = "1.1.0"
val sparkVersion = "2.0.0"
val kafkaVersion = "0.8.2.1"

val hadoopDependencies = Seq(
    "org.apache.avro" % "avro" % "1.7.7" % "provided",
    "org.apache.avro" % "avro-mapred" % "1.7.7" % "provided"
)

val flinkDependencies = Seq(
    "org.apache.flink" %% "flink-scala" % flinkVersion % "provided",
    "org.apache.flink" %% "flink-streaming-scala" % flinkVersion % "provided",
    "org.apache.flink" %% "flink-connector-kafka-0.8" % flinkVersion exclude("org.apache.kafka", "kafka_${scala.binary.version}")
)

val sparkDependencies = Seq(
    "org.apache.spark" %% "spark-core" % sparkVersion % "provided",
    "org.apache.spark" %% "spark-streaming" % sparkVersion % "provided",
    "org.apache.spark" %% "spark-streaming-kafka-0-8" % sparkVersion exclude("org.apache.kafka", "kafka_${scala.binary.version}")
)

val kafkaDependencies = Seq(
    "org.apache.kafka" %% "kafka" % "0.8.2.1"
)

val toolDependencies = Seq(
    "com.github.scopt" %% "scopt" % "3.5.0"
)

val testDependencies = Seq(
    "org.scalactic" %% "scalactic" % "2.2.6",
    "org.scalatest" %% "scalatest" % "2.2.6" % "test"
)

lazy val root = (project in file(".")).
    settings(commonSettings: _*).
    settings(
        libraryDependencies ++= hadoopDependencies,
        libraryDependencies ++= flinkDependencies,
        libraryDependencies ++= sparkDependencies,
        libraryDependencies ++= kafkaDependencies,
        libraryDependencies ++= toolDependencies,
        libraryDependencies ++= testDependencies
    ).
    enablePlugins(AssemblyPlugin)

run in Compile <<= Defaults.runTask(fullClasspath in Compile, mainClass in(Compile, run), runner in(Compile, run))

mainClass in assembly := Some("my.organization.experiment.Experiment")
assemblyOption in assembly := (assemblyOption in assembly).value.copy(includeScala = false)

现在sbt clean assembly 遗憾地给出了以下例外:

[error] (root/*:assembly) deduplicate: different file contents found in the following:
[error] /home/kevin/.ivy2/cache/org.apache.spark/spark-streaming-kafka-0-8_2.10/jars/spark-streaming-kafka-0-8_2.10-2.0.0.jar:org/apache/spark/unused/UnusedStubClass.class
[error] /home/kevin/.ivy2/cache/org.apache.spark/spark-tags_2.10/jars/spark-tags_2.10-2.0.0.jar:org/apache/spark/unused/UnusedStubClass.class
[error] /home/kevin/.ivy2/cache/org.spark-project.spark/unused/jars/unused-1.0.0.jar:org/apache/spark/unused/UnusedStubClass.class

我该如何解决这个问题?

【问题讨论】:

    标签: scala sbt sbt-assembly


    【解决方案1】:

    https://github.com/sbt/sbt-assembly#excluding-jars-and-files

    您可以定义 assemblyMergeStrategy 并可能丢弃您列出的所有文件,因为它们都在“未使用”包中。

    【讨论】:

      【解决方案2】:

      您可以覆盖默认的冲突策略:

          val defaultMergeStrategy: String => MergeStrategy = { 
          case x if Assembly.isConfigFile(x) =>
            MergeStrategy.concat
          case PathList(ps @ _*) if Assembly.isReadme(ps.last) || Assembly.isLicenseFile(ps.last) =>
            MergeStrategy.rename
          case PathList("META-INF", xs @ _*) =>
            (xs map {_.toLowerCase}) match {
              case ("manifest.mf" :: Nil) | ("index.list" :: Nil) | ("dependencies" :: Nil) =>
                MergeStrategy.discard
              case ps @ (x :: xs) if ps.last.endsWith(".sf") || ps.last.endsWith(".dsa") =>
                MergeStrategy.discard
              case "plexus" :: xs =>
                MergeStrategy.discard
              case "services" :: xs =>
                MergeStrategy.filterDistinctLines
              case ("spring.schemas" :: Nil) | ("spring.handlers" :: Nil) =>
                MergeStrategy.filterDistinctLines
              case _ => MergeStrategy.deduplicate
            }
          case _ => MergeStrategy.deduplicate
        }
      

      你可以看到程序集默认策略是MergeStrategy.deduplicate,你可以添加一个新的案例case UnusedStubClass =&gt; MergeStrategy.first

      【讨论】:

      • 谢谢!我现在正在尝试以下操作: val defaultMergeStrategy: String => MergeStrategy = { case "UnusedStubClass" => MergeStrategy.first case x if Assembly.isConfigFile(x) => MergeStrategy.concat 但这给了我同样的错误。我做错了什么?
      • 你可以试试:{ case x: String if x.contains("UnusedStubClass") =&gt; MergeStrategy.first
      猜你喜欢
      • 2019-07-16
      • 2015-08-14
      • 2016-09-02
      • 2014-09-21
      • 2013-12-06
      • 2018-10-04
      • 2017-06-09
      • 2014-11-02
      • 2016-05-13
      相关资源
      最近更新 更多