2013-07-25 17 views
11

Ich bin in scala und SBT mit sbt-assembly Plugin codiert. Mein Projekt hat viele externe Bibliotheken und daher benötigt sbt-assembly viel Zeit, um die JAR-Datei zu packen. Ich würde gerne eine separate Jar-Dateien für meinen Code und für die Abhängigkeiten haben. Daher könnte ich einfach nur meinen Code neu kompilieren und neu packen. Wie macht man das?sbt-assembly: wie man Abhängigkeiten jar mit Hauptglas verbindet?

Fortschritt bisher:

Die folgenden Befehle in der build.sbt verhindert sbt-Baugruppe von der Verpackung der Bibliotheken:

assembleArtifact in packageScala := false

assembleArtifact in packageDependency := false

Dann getrennte Gläser können gebaut werden Passing folgende Befehle: assembly, assembly-package-scala und assembly-package-dependency. Sie stellen drei Gläser her: eines mit meinem Programm, eines mit Scalabibliotheken und eines mit allen Abhängigkeiten.

Die JAR-Datei ist jedoch nicht mehr ausführbar, da die Abhängigkeiten in der separaten JAR-Datei nicht angezeigt werden. Ich denke, ich muss einen Klassenpfad zu Assembly-sbt hinzufügen, aber ich bin nicht sicher, wie das geht. Bitte helfen Sie (detaillierte Kommentare sind willkommen, da ich neu bei SBT bin). Vielen Dank!

Antwort

5

Siehe Setting Classpath Still Can't Find External Jar. Oracle sagt:

Wenn Sie diese Option verwenden, ist die JAR-Datei die Quelle aller Benutzerklassen, und andere Benutzerklassenpfadeinstellungen werden ignoriert.

Also muss man sagen:

java -cp "foo-assembly-0.1-deps.jar:foo-assembly-0.1.jar" Main 

wo Main der Name der Hauptklasse ist, und : die Datei Separator auf Ihrem Betriebssystem (; unter Windows).

Momentan scheint es einen Fehler in assembly-package-scala zu geben, und es kommt leer heraus, aber es sollte nicht wichtig sein, weil assembly-package-dependency Scala-Bibliothek auch enthält.

+0

Es funktioniert! und es ist schnell: Die Zeit wird von etwa 40 Sekunden auf wenige Sekunden reduziert. Technischer Hinweis: Ich musste auch "scala-library-2.10.2-assembly.jar" hinzufügen, da der scala repl ansonsten instabil war. Ich könnte es kompilieren mit sbt 0.12.4 und sbt-assembly 0.9.0. – Karolis

+0

Gibt es eine Möglichkeit, diese Klassenreferenz in die JAR-Hauptdatei zu packen? Es wäre also möglich, jar auszuführen, indem Sie darauf klicken. – Karolis

+0

[sbt-onejar] (https://github.com/sbt/sbt-onejar) kann ein Jar erstellen, das andere Jars und Pakete schneller enthält. Aber ich höre, dass die sbt-Assembly schneller startet, weil vermutlich ein einzelnes Jar benötigt, um es im Handumdrehen zu entpacken. sbt-assembly 0.9.0 speichert Lib-Unzips, so dass Sie sie nicht teilen müssen. –