2015-02-11 19 views
63

Używam SBT (w ramach IntelliJ IDEA) do zbudowania prostego projektu Scala.Jak zbudować Uber JAR (Fat JAR) za pomocą SBT w ramach IntelliJ IDEA?

Chciałbym wiedzieć, co jest Najprostszym sposobem zbudować Uber plik JAR (aka Gruby JAR, Super JAR).

obecnie używam SBT ale kiedy jestem wysłaniem mój plik JAR do Apache Spark pojawia się następujący błąd:

Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes

albo to błąd podczas kompilacji:

java.lang.RuntimeException: deduplicate: different file contents found in the following:
PATH\DEPENDENCY.jar:META-INF/DEPENDENCIES
PATH\DEPENDENCY.jar:META-INF/MANIFEST.MF

To looks like dzieje się tak dlatego, że niektóre z moich zależności zawierają pliki sygnatur (META-INF), które należy usunąć w ostatecznym pliku JAR Uber.

Próbowałem użyć sbt-assembly wtyczki tak:

/project/assembly.sbt

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

/project/plugins.sbt

logLevel := Level.Warn 

/build.sbt

lazy val commonSettings = Seq(
    name := "Spark-Test" 
    version := "1.0" 
    scalaVersion := "2.11.4" 
) 

lazy val app = (project in file("app")). 
    settings(commonSettings: _*). 
    settings(
    libraryDependencies ++= Seq(
     "org.apache.spark" %% "spark-core" % "1.2.0", 
     "org.apache.spark" %% "spark-streaming" % "1.2.0", 
     "org.apache.spark" % "spark-streaming-twitter_2.10" % "1.2.0" 
    ) 
) 

Po kliknięciu "Artefakt kompilacji ..." w IntelliJ IDEA Dostaję plik JAR. Ale kończę z tym samym błędem ...

Jestem nowy w SBT i nie bardzo eksperymentowałem z IntelliJ IDE.

Dzięki.

+2

przez dźwięk rzeczy może trzeba odfiltrować 'pliki META-INF' - jeden blogu, że potęga * * help: https: //janschulte.wordpress.com/2014/03/20/removing-meta-inf-directory-from-sbt-assembly/ –

Odpowiedz

106

końcu całkowicie pominąć przy użyciu IntelliJ IDEA, aby uniknąć generowania hałasu w moim globalnego zrozumienia :)

zacząłem czytać ten official SBT tutorial.

tworzę projekt o następującej strukturze pliku:

my-project/project/assembly.sbt 
my-project/src/main/scala/myPackage/MyMainObject.scala 
my-project/build.sbt 

dodał sbt-assemblyplugin w moim assembly.sbt pliku. Pozwalając mi zbudować JAR tłuszcz:

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

Moje minimalne build.sbt wygląda następująco:

lazy val root = (project in file(".")). 
    settings(
    name := "my-project", 
    version := "1.0", 
    scalaVersion := "2.11.4", 
    mainClass in Compile := Some("myPackage.MyMainObject")   
) 

libraryDependencies ++= Seq(
    "org.apache.spark" %% "spark-core" % "1.2.0" % "provided", 
    "org.apache.spark" %% "spark-streaming" % "1.2.0" % "provided", 
    "org.apache.spark" % "spark-streaming-twitter_2.10" % "1.2.0" 
) 

// META-INF discarding 
mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) => 
    { 
    case PathList("META-INF", xs @ _*) => MergeStrategy.discard 
    case x => MergeStrategy.first 
    } 
} 

Uwaga: the % "provided" nie znaczy to zależność w końcowym tłuszczu (JAR te biblioteki są już uwzględnione w moich pracownikach)

Uwaga: Odrzucenie META-INF inspired by this answser.

Uwaga: Znaczenie % i %%

Teraz mogę budować mój tłuszcz JAR użyciu SBT (how to install it), uruchamiając następującą komendę w moim /my-projektu folderu root:

sbt assembly 

Mój gruby JAR znajduje się teraz w nowym wygenerowanym folderze /target:

/my-project/target/scala-2.11/my-project-assembly-1.0.jar 

Nadzieję, że pomaga komuś innemu.


Dla tych, którzy chcą embeed SBT ciągu IntelliJ IDE: How to run sbt-assembly tasks from within IntelliJ IDEA?

+1

Sugestia Java/Maven na temat [problemu z wyłączeniem Sparka z słoików uber z Databricks https: // databricks.gitbooks.io/databricks-spark-knowledge-base/content/troubleshooting/missing_dependencies_in_jar_files.htm – JimLohse

+3

@JimLohse Właściwy link to https://databricks.gitbooks.io/databricks-spark-knowledge-contact/troubleshooting/missing_dependencies_in_jar_files .html –

+0

@ZekeFast Dobre dzięki dzięki! – JimLohse

11

Dodaj poniższą linię do swojego projektu/plugins.sbt

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

Dodaj następujące do build.sbt

Strategia scalania zespołu służy do rozwiązywania konfliktów o ccurred podczas tworzenia słoika tłuszczu.

+1

Możesz utworzyć gruby Jar, uruchamiając "montaż sbt" w konsoli – ARMV

+1

dla wersji scala 2.11.8 (wersja SBT: 0.13.12) umieścić addSbtPlugin ("com.eed3si9n"% "sbt-assembly"% "0.12.0") w projekcie/assembly.sbt – ARMV

31

3 Etap procesu dla budynku Uber JAR/tłuszcz słoik IntelliJ idea:

Uber JAR/tłuszcz JAR: JAR o wszystkie zewnętrzne zależności libraray w nim.

  1. Dodanie wtyczki SBT Zgromadzenie w IntelliJ Idea

    Plugin sbt Path

    Go do Nazwa_projektu pliku/projektu/target/plugins.sbt i dodać tę linię addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")

  2. Dodawanie Merge, Odrzuć i Nie dodawaj strategii w build.sbt

    Build sbt Path

    idź do NazwaProjektu/build.sbt plik i dodać Strategię dla pakowania słoju Uber

    Merge Strategia: Jeśli istnieje konflikt w dwóch opakowaniach o wersji biblioteki następnie, który z nich paczka w Uber JAR.
    Strategia odrzucania: Aby usunąć niektóre pliki z biblioteki, których nie chcesz pakować w Uber JAR.
    Nie dodawaj strategii: Nie dodawaj pakietu do Uber JAR.
    Na przykład: spark-core będzie już obecny w Twoim klastrze Spark.Więc nie powinniśmy zapakować to w Uber JAR

    Strategia Merge i wyrzucić Strategia Kod podstawowy:

    assemblyMergeStrategy in assembly := { case PathList("META-INF", xs @ _*) => MergeStrategy.discard case x => MergeStrategy.first }

    więc prosisz, aby odrzucić pliki META-INF poleceniem MergeStrategy.discard i dla reszty plików, które biorą Państwo pod pierwsze wystąpienie pliku biblioteki, jeśli wystąpi konflikt za pomocą tego polecenia MergeStrategy.first.

    Nie Dodaj Strategia Kod podstawowy:

    libraryDependencies += "org.apache.spark" %% "spark-core" % "1.4.1" %"provided"

    Jeśli nie chcemy, aby dodać Iskra-core do naszego pliku JAR Uber jak to będzie już na naszej clutser, więc jesteśmy dodając % "provided" na końcu zależności biblioteki.

  3. budynku Uber JAR ze wszystkimi jego zależnościami

    sbtassembly

    w terminalu typu sbt assembly do budowania pakietu


Voila !!! Uber JAR jest zbudowany. JAR będzie Nazwa_projektu/target/scala-XX

JarBuilt