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?)

War es hilfreich?

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

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

    addSbtPlugin ( "com.eed3si9n" % "SBT-assembly" % "0.11.2")

  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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top