Проблема зависимости с Scalding и Hadoop с sbt-сборкой

Я пытаюсь построить далеко с sbt простой задачи hadoop, которую я пытаюсь запустить, пытаясь запустить ее на Amazon EMR. Однако когда я бегу sbt assembly Я получаю следующую ошибку:

[error] (*:assembly) deduplicate: different file contents found in the following:
[error] /Users/trenthauck/.ivy2/cache/org.mortbay.jetty/jsp-2.1/jars/jsp-2.1-6.1.14.jar:org/apache/jasper/compiler/Node$ChildInfo.class
[error] /Users/trenthauck/.ivy2/cache/tomcat/jasper-compiler/jars/jasper-compiler-5.5.12.jar:org/apache/jasper/compiler/Node$ChildInfo.class
[error] Total time: 10 s, completed Sep 14, 2013 4:49:24 PM

Я попытался следовать предложению здесь https://groups.google.com/forum/, однако это не сработало.

Мой build.sbt выглядит так:

import AssemblyKeys._

mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
  {
    case PathList("org", "apache", "jasper", xs @ _*) => MergeStrategy.last
    case x => old(x)
  }
}

assemblySettings

name := "Scaling Play"

version := "SNAPSHOT-0.1"

scalaVersion := "2.10.1"

libraryDependencies ++= Seq(
  "com.twitter" % "scalding-core_2.10" % "0.8.8",
  "com.twitter" % "scalding-args_2.10" % "0.8.8",
  "com.twitter" % "scalding-date_2.10" % "0.8.8",
  "org.apache.hadoop" % "hadoop-core" % "1.0.0"
  )

1 ответ

Решение

Порядок директив важен. Вы обновляете настройки сборки, чтобы перезаписать ее снова на строку позже. Сначала определите AssemblySettings, а затем обновите его.

Обновленный build.sbt:

import AssemblyKeys._

assemblySettings

mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
  {
    case PathList("org", "apache", "jasper", xs @ _*) => MergeStrategy.last
    case x => old(x)
  }
}

…

После этого вы обнаружите, что существует гораздо больше конфликтующих классов и других файлов. В этом случае вам потребуются следующие слияния:

case PathList("org", "apache", xs @ _*) => MergeStrategy.last
case PathList("javax", "servlet", xs @ _*) => MergeStrategy.last
case PathList("com", "esotericsoftware", xs @ _*) => MergeStrategy.last
case PathList("project.clj") => MergeStrategy.last
case PathList("overview.html") => MergeStrategy.last
case x => old(x)

Обратите внимание, что использование стратегий слияния для файлов классов может привести к проблемам, вызванным несовместимыми версиями этого конкретного класса. Если это так, то ваша проблема больше, потому что тогда зависимости несовместимы друг с другом. Затем вам придется прибегнуть к удалению зависимости и найти / сделать совместимую версию.

Другие вопросы по тегам