Herstellung von Stand-alone-Glas mit Simple Build-Tool
Frage
Gibt es eine Möglichkeit zu sagen, sbt alle benötigten Bibliotheken zu verpacken (scala-library.jar) in das Hauptpaket, so dass es Stand-alone ist? (Statisch?)
Lösung
Bearbeiten 2011:
Seitdem retronym (die veröffentlichte ein Antwort auf dieser Seite zurück 2010 ), machte diese sbt-Plugin "sbt-onejar" , jetzt in seinem neue Adresse auf GitHub , mit docs für SBT aktualisiert 0.12.
Pakete Ihr Projekt mit One-JAR ™
onejar-sbt
ist eine einfache Build-Werkzeug-Plugin für den Aufbau eine einzige ausführbare JAR enthält die gesamten Code und Abhängigkeiten als geschachtelte JAR-Dateien.
Derzeit ist One-JAR-Version 0.9.7 verwendet. Dies wird mit dem Plugin enthalten und muss nicht separat heruntergeladen werden.
Original Antwort:
Direkt, ist dies nicht möglich, ohne sbt erstreckt (a benutzerdefinierte Aktion nach dem Modell des "Paket" sbt Aktion ).
GitHub erwähnt eine Aufgabe Montage, speziell für Anlegesteg Einsatz gemacht. Man könnte es für Ihren Bedarf anpassen though.
Der Code ist ziemlich allgemein (von diesen Beitrag 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)
}
Andere Tipps
Es dauert ein bisschen Arbeit, aber Sie können auch verwenden, Proguard aus SBT einen eigenständigen zu erstellen JAR.
habe ich das vor kurzem in dem SBT build für Scalala .
Arbeiten ab von dem, was oben angebotenen @retronym, ich baute eine
Das einfachste Beispiel unter Verwendung von sbt-assembly Verzeichnis erstellen Projekt in Ihrem home-Projekt Verzeichnis mit Datei assembly.sbt einschließlich addSbtPlugin ( "com.eed3si9n" % "SBT-assembly" % "0.11.2") In der 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) } }
Die einfachste Methode ist nur das Glas von der Kommandozeile zu erstellen. Wenn Sie nicht wissen, wie Sie dies tun würde ich empfehlen, dass Sie das tun. Automation ist nützlich, aber seine viel besser, wenn Sie wissen, was die Automatisierung tut.
Der einfachste Weg, die Schaffung eines runnable jar zu automatisieren ist ein Bash-Skript oder Batch-Skript in Windows zu verwenden.
Der einfachste Weg in sbt ist nur die Scala Bibliotheken, die Sie auf die Ressourcen-Verzeichnisse hinzufügen müssen:
unmanagedResourceDirectories in Compile := Seq(file("/sdat/bins/ScalaCurrent/lib/scalaClasses"))
So in meiner Umgebung ScalaCurrent ist ein Link auf die aktuelle Bibliothek Scala. 2.11.4 zum Zeitpunkt des Schreibens. Der entscheidende Punkt ist, dass ich die Scala Bibliothek extrahieren, aber es in einem ScalaClassses Verzeichnis. Jede Bibliothek Bedürfnisse extrahiert in seine Top-Level-Verzeichnis gehen.