Wie effizient arbeiten mit SBT, Funke und "vorgesehen" Abhängigkeiten?
Baue ich ein Apache-Spark-Applikation in Scala und ich bin mit SBT, um es zu bauen. Hier ist die Sache:
- wenn ich die Entwicklung unter IntelliJ IDEA, ich will Funken Abhängigkeiten in den classpath (ich bin der Einführung eine regelmäßige Anwendung mit einer main-Klasse)
- wenn ich die Anwendung Verpacken (Dank der sbt-Montage) plugin, ich nicht möchten Spark-Abhängigkeiten aufgenommen zu werden in mein Fett JAR
- wenn ich unit-tests durch
sbt test
möchte ich Spark Abhängigkeiten in den classpath (gleiche wie #1, aber von den SBT)
Passend Einschränkung #2, ich bin deklarieren Funke Abhängigkeiten als provided
:
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-streaming" % sparkVersion % "provided",
...
)
Dann, sbt-Montage-Dokumentation schlägt vor, fügen Sie die folgende Zeile, um die Abhängigkeiten für unit-tests (Einschränkung #3):
run in Compile <<= Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run))
Lässt mich mit Einschränkung #1 nicht voll gefüllt, d.h. ich kann nicht führen Sie die Anwendung in IntelliJ IDEA als Funke Abhängigkeiten nicht abgeholt wird.
Mit Maven, war ich mit einem bestimmten Profil zu bauen, die uber JAR. So, ich war die Deklaration Funke Abhängigkeiten als regelmäßige Abhängigkeiten für das main-Profil (IDE-und unit-tests), während Sie deklarieren Sie als provided
für das fat-JAR-Verpackung. Sehen https://github.com/aseigneurin/kafka-sandbox/blob/master/pom.xml
Was ist der beste Weg, dies zu erreichen mit SBT?
- nur um daran zu erinnern, bei der Verwendung von
spark-submit
spark verwenden libs von spark-Installations-Pfad, nicht die libs, die Sie verpackt in Ihre Versammlung jar. es sei denn, Sie ausdrücklich gesagt, es zu. die config heißt `` Beide sbt und Assembler Maven-plugins. Beim erstellen von Montage-Gläser, Liste Spark und Hadoop wie Abhängigkeiten; diese müssen nicht gebündelt werden, da diese Angaben werden von der cluster-manager zur Laufzeit. Sobald Sie ein zusammengesetztes Glas, das Sie aufrufen die bin/Funke-submit-Skript, wie hier gezeigt, während Sie Ihr Glas.``
Du musst angemeldet sein, um einen Kommentar abzugeben.
(Die Beantwortung meiner eigenen Frage mit einer Antwort bekam ich von einem anderen Kanal...)
Ausführen zu können, der Funke Anwendung von IntelliJ IDEE, die Sie ganz einfach erstellen Sie eine main-Klasse in der
src/test/scala
Verzeichnis (test
, nichtmain
). IntelliJ abholen derprovided
Abhängigkeiten.Dank Matthieu Blanc für den Hinweis.
run in Compile <<= Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run))
provided
auch Abhängigkeiten in einfachen Netz-kein Netz untertest
zu lösen-das Szenario nicht in IntelliJ, aber in einer Weise, die in der Codebasis selbst? Ich Frage mich, ob sbt unterstützt und IntelliJ wiederum weiß zu importieren, die Art der definition von sbt.Verwenden Sie die neue " Include-Abhängigkeiten mit "Sofern" scope " in einem IntelliJ-Konfiguration.
Sie brauchen, um die IntellJ Arbeit.
Der wichtigste trick hier ist, um zu schaffen ein weiteres Teilprojekt, das wird davon abhängen, die wichtigste Teilprojekt und wird alle seine zur Verfügung gestellten Bibliotheken kompilieren Umfang. Dazu füge ich die folgenden Zeilen zu erstellen.sbt:
Ich jetzt aktualisieren Projekts in IDEE und etwas ändern vorherigen Konfiguration auszuführen, so wird es mit neuen mainRunner Modul classpath:
Funktioniert bei mir einwandfrei.
Quelle: https://github.com/JetBrains/intellij-scala/wiki/%5BSBT%5D-How-to-use-provided-libraries-in-run-configurations
assembly := new File("")
zu denmainRunner
Einstellungen, so dass diesbt assembly
Befehl würde nicht versuchen zu laufen, auf dermainRunner
Projekt.java.lang.IllegalArgumentException: requirement failed: Configurations already specified for module org.apache.spark:spark-core:2.1.1:provided
als Fehler.scalaVersion
zu sein, das gleiche wie erklärt, oben in derbuild.sbt
Datei[Veraltet] Siehe neue Antwort "nutze die neue 'Include-Abhängigkeiten mit "Sofern" scope " in einem IntelliJ-Konfiguration." beantworten.
Die einfachste Methode zum hinzufügen von
provided
Abhängigkeiten zu Debuggen, die eine Aufgabe mitIntelliJ
ist:src/main/scala
Mark Directory as...
>Test Sources Root
Dieser erzählt
IntelliJ
zu behandelnsrc/main/scala
als test-Ordner, für die Sie fügt hinzu, alle Abhängigkeiten tagged asprovided
zu jeder Konfiguration (debug/run).Jedes mal, wenn Sie eine SBT aktualisieren, wiederholen Sie diesen Schritt, wie IntelliJ wird zurückgesetzt, die Ordner auf einem regulären source-Ordner.
src/main/scala
geht zurück zuSources Root
Lösung basierte auf der Erstellung ein weiteres Teilprojekt für die Ausführung des Projekts vor Ort ist beschrieben hier.
Im Grunde müssten Sie modifizieren die
build.sbt
- Datei mit dem folgenden:Und führen Sie dann das neue Teilprojekt lokal mit
Use classpath of module: localRunner
im Run-Konfiguration.Sollten Sie nicht auf der Suche an SBT für eine IDEE-spezifische Einstellung.
Vor allem, wenn das Programm soll ausgeführt werden mit spark-vorzulegen, wie sind Sie auf die IDEE ? Ich vermute, Sie würde ausgeführt werden, als standalone-IDEE, die beim ausführen durch Funken -, reichen in der Regel.
Wenn das der Fall ist, manuell hinzufügen der spark-Bibliotheken in der IDEE, mithilfe von Datei - |Projektstruktur| - Bibliotheken. Du wirst sehen, alle Abhängigkeiten aufgelistet, von SBT, aber Sie können fügen Sie beliebige jar/maven-Artefakte mithilfe der + (plus) Zeichen.
Das sollte den trick tun.
Für läuft der Funken Arbeitsplätze, die Allgemeine Lösung von "versehen" - Abhängigkeiten arbeiten: https://stackoverflow.com/a/21803413/1091436
Können Sie die app entweder aus
sbt
oder Intellij IDEE, oder irgendetwas anderes.Es im Grunde läuft darauf hinaus, diese:
Warum nicht umgehen, sbt und manuell hinzufügen spark-core-und spark-streaming-Bibliotheken, um Ihre Modul-Abhängigkeiten?
org.apache.spark:spark-core_2.10:1.6.1
https://www.jetbrains.com/help/idea/2016.1/configuring-module-dependencies-and-libraries.html?origin=old_help#add_existing_lib