ошибка при запуске сборки sbt: ошибка дедупликации sbt

Я столкнулся с точной проблемой, как описано в сообщении ниже, и предложенный ответ не помогает. sbt-assembly: обнаружена ошибка дедупликации

[error] (*:assembly) deduplicate: different file contents found in the following:
[error] C:\Users\xxx\.ivy2\cache\org.eclipse.jetty.orbit\javax.transaction\orbits\javax.transaction-1.1.1.v201105210645.jar:META-INF/ECLIPSEF.RSA
[error] C:\Users\xxx\.ivy2\cache\org.eclipse.jetty.orbit\javax.servlet\orbits\javax.servlet-3.0.0.v201112011016.jar:META-INF/ECLIPSEF.RSA
[error] C:\Users\xxx\.ivy2\cache\org.eclipse.jetty.orbit\javax.mail.glassfish\orbits\javax.mail.glassfish-1.4.1.v201005082020.jar:META-INF/ECLIPSEF.RSA
[error] C:\Users\xxx\.ivy2\cache\org.eclipse.jetty.orbit\javax.activation\orbits\javax.activation-1.1.0.v201105071233.jar:META-INF/ECLIPSEF.RSA
[error] Total time: 14 s, completed Sep 9, 2014 5:21:01 PM

мой файл build.sbt содержит

name := "Simple"

version := "0.1.0"

scalaVersion := "2.10.4"

libraryDependencies ++= Seq(
  "org.twitter4j" % "twitter4j-stream" % "3.0.3"
)

//libraryDependencies += "org.apache.spark" %% "spark-core" % "1.0.2"

libraryDependencies += "org.apache.spark" %% "spark-streaming" % "1.0.2"

libraryDependencies += "org.apache.spark" %% "spark-streaming-twitter" % "1.0.2"

libraryDependencies += "com.github.nscala-time" %% "nscala-time" % "0.4.2"

libraryDependencies ++= Seq(
    ("org.apache.spark"%%"spark-core"%"1.0.2").
    exclude("org.eclipse.jetty.orbit", "javax.servlet").
    exclude("org.eclipse.jetty.orbit", "javax.transaction").
    exclude("org.eclipse.jetty.orbit", "javax.mail").
    exclude("org.eclipse.jetty.orbit", "javax.activation").
    exclude("commons-beanutils", "commons-beanutils-core").
    exclude("commons-collections", "commons-collections").
    exclude("commons-collections", "commons-collections").
    exclude("com.esotericsoftware.minlog", "minlog")
)

resolvers += "Akka Repository" at "http://repo.akka.io/releases/"

    mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
    {
        case PathList("javax", "servlet", xs @ _*)         => MergeStrategy.first
        case PathList("javax", "transaction", xs @ _*)     => MergeStrategy.first
        case PathList("javax", "mail", xs @ _*)     => MergeStrategy.first
        case PathList("javax", "activation", xs @ _*)     => MergeStrategy.first
        case PathList(ps @ _*) if ps.last endsWith ".html" => MergeStrategy.first
        case "application.conf" => MergeStrategy.concat
        case "unwanted.txt"     => MergeStrategy.discard
        case x => old(x)
        }
    }

Любые указатели на то, как исправить вышеуказанную проблему?


person Siva    schedule 09.09.2014    source источник


Ответы (2)


Если вы планируете запускать свою программу из Spark, я настоятельно рекомендую добавить все зависимости Spark как provided, чтобы они были исключены из задачи сборки.

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core"              % "1.0.2" % "provided",
  "org.apache.spark" %% "spark-streaming"         % "1.0.2" % "provided",
  "org.apache.spark" %% "spark-streaming-twitter" % "1.0.2" % "provided")

В другом случае вам нужно либо удалить эти jar из пути к классам, либо добавить соответствующие строки в mergeStrategy, в вашем случае это будет

case PathList("META-INF", "ECLIPSEF.RSA") => MergeStrategy.first

Если вы все еще хотите иметь дело с адом зависимостей Spark, вам поможет плагин sbt-dependency-graph. . Также обратите внимание, что другие зависимости Spark, такие как spark-streaming и spark-streaming-twitter, возможно, также нуждаются в директиве exclude.

person 4e6    schedule 09.09.2014
comment
не могли бы вы уточнить это. Если вы планируете запускать свою программу из Spark, я настоятельно рекомендую добавить все зависимости Spark, как это предусмотрено. Как их добавить? - person Siva; 12.09.2014
comment
@Siva Это означает, что в случае, когда Spark работает, эти банки уже доступны при развертывании задания, и нет необходимости отправлять их вместе с приложением. Смотрите мой обновленный ответ. - person 4e6; 12.09.2014
comment
И когда я попытался добавить вышеуказанную стратегию слияния, это привело к еще одной ошибке, [ошибка] C:\Users\xxx\.ivy2\cache\com.esotericsoftware.kryo\kryo\bundles\kryo-2.21.jar:com /esotericsoftware/minlog/Log$Logger.class error] C:\Users\xxx\.ivy2\cache\com.esotericsoftware.minlog\minlog\jars\minlog-1.2.jar:com/esotericsoftware/minlog/Log$Logger. класс - person Siva; 12.09.2014
comment
Проблема в том, что это противоречит всей сути сборки... то есть построить толстую банку, в которой не нужно беспокоиться о пути к классам. - person samthebest; 19.11.2014

Поэтому, чтобы избавиться от надоедливых сообщений о «дедупликации», я не беспокоился об исключении, похоже, это мне не помогло. Я скопировал и вставил defaultMergeStrategy из кода sbt и просто изменил строку, где написано deduplicate, на first. Мне также пришлось добавить все в конце, чтобы настаивать на first тоже. Честно говоря, я понятия не имею, что это значит, или почему раздражающие сообщения исчезают... У меня нет времени, чтобы получить докторскую степень в sbt, я хочу, чтобы мой код просто собирался!! Таким образом, стратегия слияния становится:

mergeStrategy in assembly <<= (mergeStrategy in assembly) ((old) => {
  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.first // Changed deduplicate to first
    }
  case PathList(_*) => MergeStrategy.first // added this line
})
person samthebest    schedule 19.11.2014
comment
Это сработало? Я попробовал, и толстая банка оказалась подозрительно маленькой. - person User; 24.04.2019