2010-05-22 5 views
23

Gibt es eine Möglichkeit, sbt zu sagen, alle benötigten Bibliotheken (scala-library.jar) in das Hauptpaket zu packen, so dass es eigenständig ist? (Statisch?)Erstellen von Standalone-JAR mit Simple Build Tool

+0

möglich Duplikat von [Wie ein sbt-Managed Anwendung Projekt ohne sbt laufen?] (Http://stackoverflow.com/questions/7195079/how-to-run-a-sbt-managed-application-project-without -sbt) –

+0

Duplizieren von http://stackoverflow.com/q/7195079/1305344 und http://stackoverflow.com/q/7134993/1305344 –

+0

http://blog.prabeeshk.com/blog/2014/04/ 01/a-Standalone-Spark-Anwendung-in-Scala/ –

Antwort

14

Bearbeiten 2011:
Seitdem retronym (die eine answer in this page back in 2010 geschrieben), machte diese sbt-plugin "sbt-onejar", jetzt in seinem new address on GitHub, mit docs für SBT aktualisiert 0.12.

Pakete Ihr Projekt One-JAR™

onejar-sbt verwendet, ist ein einfaches Build-Werkzeug-Plugin für eine ausführbare JAR-Aufbau enthält den gesamten Code und Abhängigkeiten als verschachtelte JAR-Dateien.
Derzeit wird One-JAR Version 0.9.7 verwendet. Dies ist im Lieferumfang des Plugins enthalten und muss nicht separat heruntergeladen werden.


Ursprüngliche Antwort:

Direkt, ist dies nicht möglich, ohne sbt erstreckt (ein custom action nach dem Modell der "package" sbt action).

GitHub mentions an assembly task, maßgeschneidert für den Einsatz an Landungsbrücken. Sie können es jedoch für Ihre Bedürfnisse anpassen.

Die code is pretty generic (von this post und Benutzer Rio):

project/build/AssemblyProject.scala 

import sbt._ 

trait AssemblyProject extends BasicScalaProject 
{ 
     def assemblyExclude(base: PathFinder) = base/"META-INF" ** "*" 
     def assemblyOutputPath = outputPath/assemblyJarName 
     def assemblyJarName = artifactID + "-assembly-" + version + ".jar" 
     def assemblyTemporaryPath = outputPath/"assembly-libs" 
     def assemblyClasspath = runClasspath 
     def assemblyExtraJars = mainDependencies.scalaJars 

     def assemblyPaths(tempDir: Path, classpath: PathFinder, extraJars: PathFinder, exclude: PathFinder => PathFinder) = 
     { 
       val (libs, directories) = classpath.get.toList.partition(ClasspathUtilities.isArchive) 
       for(jar <- extraJars.get ++ libs) FileUtilities.unzip(jar, tempDir, log).left.foreach(error) 
       val base = (Path.lazyPathFinder(tempDir :: directories) ##) 
       (descendents(base, "*") --- exclude(base)).get 
     } 

     lazy val assembly = assemblyTask(assemblyTemporaryPath, assemblyClasspath, assemblyExtraJars, assemblyExclude) dependsOn(compile) 
     def assemblyTask(tempDir: Path, classpath: PathFinder, extraJars: PathFinder, exclude: PathFinder => PathFinder) = 
       packageTask(Path.lazyPathFinder(assemblyPaths(tempDir, classpath, extraJars, exclude)), assemblyOutputPath, packageOptions) 
} 
+2

Es funktioniert. Aber sollte es nicht in SBT eingebaut werden? –

+3

imho sollte es sein. Ich habe eine leicht modifizierte Version dieses AssemblyProjekts seit einigen Monaten erfolgreich verwendet. Es wird bei doppelten Dateien fehlschlagen (etwas, auf das Sie achten müssen, wenn Sie ein komplexes Projekt mit Unterprojekten haben), und wird mit dem letzten Build von Hibernate fehlschlagen (Hibernate enthält einige seltsame Zip-Einträge, die es Kummer verursachen). – Michael

+1

Die URL zu sbt-onejar hat sich geändert: https://github.com/sbt/sbt-onejar (hat eine neue Version und Dokumentation für SBT aktualisiert 0.12) – akauppi

6

Es dauert ein bisschen Arbeit, aber Sie auch Proguard aus SBT erstellen einen eigenständigen JAR verwenden können.

Ich tat dies kürzlich in der SBT build for Scalala.

+1

Proguard ist mächtig, aber wenn Sie eine Menge Gläser, müssen Sie manuell dynamisch aufgerufen jede Klasse oder Methode definieren - siehe http://proguard.sourceforge.net/index.html#/manual/limitations.html und siehe „Probleme zur Laufzeit“ http: // proguard .sourceforge.net/index.html #/manual/troubleshooting.html –

+0

gerechte Strafe für außerhalb des Typ-System Schritt;) – retronym

+0

https://github.com/ymasory/sbt-prototype verwendet [Proguard] (http: // proguard .sourceforge.net /) um ein ausführbares jar zu erstellen. Der Prototyp funktioniert einwandfrei, zumindest auf einer einfachen Anwendung. – user272735

0

Ausgehend von dem, was @retronym oben angeboten, baute ich eine simple example, die ein Stand-alone-Krug baut, der die Scala-Bibliotheken (d. Scala-Bibliothek.jar) mit Proguard mit sbt enthält. Danke, retronym.

0

Das einfachste Beispiel sbt-assembly

  1. Verzeichnis erstellen Projekt in Ihrem home-Projekt dir mit Datei assembly.sbt einschließlich

    addSbtPlugin ("com.eed3si9n" % "sbt-assembly" % „0,11 mit 0,2")

  2. In Datei build.sbt

    Import AssemblyKeys._ // fügen Sie am Anfang der Datei

    assemblySettings

    jarName + = "Mmyjarnameall.jar"

    libraryDependencies ++ = Seq ("exmpleofmydependency% "mydep" %" 0.1")

    mergeStrategy in der Montage < < = (mergeStrategy in der Montage) {(alt) =>

    {

    Fall s, wenn s.endsWith ("Klasse") => MergeStrategy.last

    Fall s, wenn s.endsWith ("pom.xml") => MergeStrategy.last

    Fall s, wenn s.endsWith ("pom.properties") => MergeStrategy.last

    Fall x => alt (x)

    }

    }

0

Die einfachste Methode ist nur das Glas von der Kommandozeile zu erstellen. Wenn Sie nicht wissen, wie das geht, würde ich Ihnen wärmstens empfehlen, dies zu tun. Automatisierung ist nützlich, aber es ist viel besser, wenn Sie wissen, was die Automatisierung macht.

Der einfachste Weg, die Schaffung eines runnable jar zu automatisieren, ist in den Fenstern einen Bash-Skript oder Batch-Skript zu verwenden.

Die einfachste Art und Weise in sbt ist nur die Scala hinzuzufügen Bibliotheken, die Sie zu den Ressourcen-Verzeichnisse müssen:

unmanagedResourceDirectories in Compile := Seq(file("/sdat/bins/ScalaCurrent/lib/scalaClasses")) 

So in meiner Umgebung ScalaCurrent ein Link auf die aktuelle Scala Bibliothek ist. 2.11.4 zum Zeitpunkt des Schreibens. Der entscheidende Punkt ist, dass ich die Scala-Bibliothek entpacke, sie aber in ein ScalaClasses-Verzeichnis lege. Jede extrahierte Bibliothek muss in ihr oberstes Verzeichnis gehen.

Verwandte Themen