2015-05-25 26 views
9

Uruchomiłem aplikację iskrową i chcę spakować klasy testowe do słoika. To, co jest dziwne, to, że pomyślnie uruchomiłem "sbt assembly", ale nie udało mi się, gdy uruchomiłem "sbt test: assembly".iskra + montaż sbt: "deduplikacja: inna zawartość pliku znajduje się poniżej"

Próbowałem sbt-assembly : including test classes, to nie działało w moim przypadku.

SBT wersja: 0.13.8

build.sbt:

import sbtassembly.AssemblyPlugin._ 

name := "assembly-test" 

version := "1.0" 

scalaVersion := "2.10.5" 

libraryDependencies ++= Seq(
    ("org.apache.spark" % "spark-core_2.10" % "1.3.1" % Provided) 
    .exclude("org.mortbay.jetty", "servlet-api"). 
    exclude("commons-beanutils", "commons-beanutils-core"). 
    exclude("commons-collections", "commons-collections"). 
    exclude("commons-logging", "commons-logging"). 
    exclude("com.esotericsoftware.minlog", "minlog").exclude("com.codahale.metrics", "metrics-core"), 
    "org.json4s" % "json4s-jackson_2.10" % "3.2.10" % Provided, 
    "com.google.inject" % "guice" % "4.0" 
) 

Project.inConfig(Test)(assemblySettings) 

Odpowiedz

13

Trzeba będzie zdefiniować mergeStratey w montażu, jak to, co zrobiłem dla mojego app zapłonowej poniżej.

mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) => 
    { 
    case PathList("javax", "servlet", xs @ _*) => MergeStrategy.last 
    case PathList("javax", "activation", xs @ _*) => MergeStrategy.last 
    case PathList("org", "apache", xs @ _*) => MergeStrategy.last 
    case PathList("com", "google", xs @ _*) => MergeStrategy.last 
    case PathList("com", "esotericsoftware", xs @ _*) => MergeStrategy.last 
    case PathList("com", "codahale", xs @ _*) => MergeStrategy.last 
    case PathList("com", "yammer", xs @ _*) => MergeStrategy.last 
    case "about.html" => MergeStrategy.rename 
    case "META-INF/ECLIPSEF.RSA" => MergeStrategy.last 
    case "META-INF/mailcap" => MergeStrategy.last 
    case "META-INF/mimetypes.default" => MergeStrategy.last 
    case "plugin.properties" => MergeStrategy.last 
    case "log4j.properties" => MergeStrategy.last 
    case x => old(x) 
    } 
} 
+0

umieścić wszystkie te rzeczy w pliku SBT i dodano więcej „wyklucza (...)” klauzule, słoik mogą być generowane i ćwiczenia testowe są także w słoiku, jednak znalazłem „pod warunkiem” nie działa – Grant

+0

"provided" jest potrzebne tylko wtedy, gdy przesyłasz swoją aplikację iskrową za pośrednictwem programu iskrowego. Jeśli uruchomisz aplikację iskier bezpośrednio, nie używaj "dostarczonego". –

20

Jako dodatek do odpowiedzi Wesley Milano, kod musi zostać dostosowany trochę do nowszej wersji (tj 0.13.0) wtyczki SBT-montażowej, w przypadku gdy ktoś zastanawia się o ostrzeżeniach Deprecation:

assemblyMergeStrategy in assembly := { 
    case PathList("javax", "servlet", xs @ _*) => MergeStrategy.last 
    case PathList("javax", "activation", xs @ _*) => MergeStrategy.last 
    case PathList("org", "apache", xs @ _*) => MergeStrategy.last 
    case PathList("com", "google", xs @ _*) => MergeStrategy.last 
    case PathList("com", "esotericsoftware", xs @ _*) => MergeStrategy.last 
    case PathList("com", "codahale", xs @ _*) => MergeStrategy.last 
    case PathList("com", "yammer", xs @ _*) => MergeStrategy.last 
    case "about.html" => MergeStrategy.rename 
    case "META-INF/ECLIPSEF.RSA" => MergeStrategy.last 
    case "META-INF/mailcap" => MergeStrategy.last 
    case "META-INF/mimetypes.default" => MergeStrategy.last 
    case "plugin.properties" => MergeStrategy.last 
    case "log4j.properties" => MergeStrategy.last 
    case x => 
     val oldStrategy = (assemblyMergeStrategy in assembly).value 
     oldStrategy(x) 
} 
+9

Używam Scala od ponad roku i nie mam pojęcia, co to za kod, ale ważne jest to, że działa. Dzięki –

+0

Dzięki i to rozwiązanie działa bardzo dobrze –

+0

@FelipeAlmeida Wydawało się, że masz doświadczenie w iskrze, więc zastanawiałem się, czy możesz mi pomóc ... Próbuję utworzyć plik jar z mojego projektu SBT, aby go uruchomić. Czy wiesz, jak mogę to zrobić? – CapturedTree