2014-09-09 4 views
3

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

[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) 
     } 
    } 

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

ответ

3

Если вы планируете запускать свою программу из 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.

+0

могли бы вы подробнее остановиться на этом «Если вы собираетесь запустить программу из искры, то я настоятельно рекомендую, чтобы добавить все зависимости Spark, как это предусмотрено.» Как добавить их? – Siva

+0

@Siva Это означает, что в случае запуска Spark эти банки уже доступны при развертывании вашей работы, и нет необходимости отправлять их с помощью приложения. См. Мой обновленный ответ. – 4e6

+1

И когда я попытался добавить вышеупомянутую стратегию слияния, это привело к еще одной ошибке, [ошибка] C: \ Users \ xxx \ .ivy2 \ cache \ com.esotericsoftware.kryo \ kryo \ bundles \ kryo-2.21.jar: com/esotericsoftware/minlog/Log $ Logger.class ошибка] C: \ Users \ xxx \ .ivy2 \ cache \ com.esotericsoftware.minlog \ minlog \ jars \ minlog-1.2.jar: com/esotericsoftware/minlog/Log $ Logger.class – Siva

0

Так что, чтобы разобраться в раздражающих сообщениях «дедупликации», я не беспокоился об исключении, это, похоже, не помогало мне. Я скопировал и вставил defaultMergeStrategy из кода sbt и только что изменил строку, где он говорит deduplicate, до first. Мне также пришлось добавить уловку в конце, чтобы настаивать на first. Честно говоря, я понятия не имею, что это значит или почему он вызывает раздражающие сообщения. У меня нет времени, чтобы получить Phd в 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 
}) 
Смежные вопросы