2013-09-04 23 views
22

Ich habe ein einzelnes Scala-Projekt mit sbt unter Verwendung einer build.scala-Datei erstellt. Ich kann sbt-Assembly verwenden, um eine einzelne ausführbare JAR-Datei aus diesem Projekt ohne Probleme zu generieren. Jetzt möchte ich mehrere ausführbare JAR-Dateien generieren, wobei jede Datei einen gemeinsamen Satz von internen und externen Basisabhängigkeiten zusammen mit verschiedenen externen Abhängigkeiten enthält.Mehrere ausführbare JAR-Dateien mit verschiedenen externen Abhängigkeiten von einem einzigen Projekt mit sbt-assembly

Ist das mit der aktuellen Version von sbt-assembly möglich? In Maven ist dies einfach, da man mehrere Profile im Pom definieren kann, die jeweils ein separates jar erzeugen, aber in sbt-assembly gibst du die Assembly-Einstellungen an dein Projekt weiter und ich habe keine Möglichkeit gefunden, die zu erzeugenden Einstellungen zu ändern mehrere JAR-Dateien.

Antwort

17

Das Konzept von Maven-Profil übersetzt in sbt/Ivy als Konfiguration. Sie können Einstellungen innerhalb einer Konfiguration definieren und haben sbt-assembly zwei jars erzeugen. Sie können einer bestimmten Konfiguration libraryDependency hinzufügen, indem Sie % "config" hinzufügen. Dies erfordert jedoch, dass das Projekt die Konfiguration (en) im Voraus kennt.

In build.sbt (sbt 0.13.0 oder höher erforderlich):

import AssemblyKeys._ 

val Dispatch10 = config("dispatch10") extend(Compile) 
val TestDispatch10 = config("testdispatch10") extend(Test) 
val Dispatch11 = config("dispatch11") extend(Compile) 
val TestDispatch11 = config("testdispatch11") extend(Test) 

val root = project.in(file(".")). 
    configs(Dispatch10, TestDispatch10, Dispatch11, TestDispatch11). 
    settings( 
    name := "helloworld", 
    organization := "com.eed3si9n", 
    scalaVersion := "2.10.2", 
    compile in Test := inc.Analysis.Empty, 
    compile in Compile := inc.Analysis.Empty, 
    libraryDependencies ++= Seq(
     "net.databinder.dispatch" %% "dispatch-core" % "0.10.0" % "dispatch10,testdispatch10", 
     "net.databinder.dispatch" %% "dispatch-core" % "0.11.0" % "dispatch11,testdispatch11", 
     "org.specs2" %% "specs2" % "2.2" % "test", 
     "com.github.scopt" %% "scopt" % "3.0.0" 
    ) 
). 
    settings(inConfig(Dispatch10)(Classpaths.configSettings ++ Defaults.configTasks ++ baseAssemblySettings ++ Seq(
    test := (test in TestDispatch10).value, 
    test in assembly := test.value, 
    assemblyDirectory in assembly := cacheDirectory.value/"assembly-dispatch10", 
    jarName in assembly := name.value + "-assembly-dispatch10_" + version.value + ".jar" 
)): _*). 
    settings(inConfig(TestDispatch10)(Classpaths.configSettings ++ Defaults.configTasks ++ Defaults.testTasks ++ Seq(
    internalDependencyClasspath := Seq((classDirectory in Dispatch10).value).classpath 
)): _*). 
    settings(inConfig(Dispatch11)(Classpaths.configSettings ++ Defaults.configTasks ++ baseAssemblySettings ++ Seq(
    test := (test in TestDispatch11).value, 
    test in assembly := test.value, 
    assemblyDirectory in assembly := cacheDirectory.value/"assembly-dispatch11", 
    jarName in assembly := name.value + "-assembly-dispatch11_" + version.value + ".jar" 
)): _*). 
    settings(inConfig(TestDispatch11)(Classpaths.configSettings ++ Defaults.configTasks ++ Defaults.testTasks ++ Seq(
    internalDependencyClasspath := Seq((classDirectory in Dispatch11).value).classpath 
)): _*) 

Um Montageaufgabe innerhalb der Konfiguration ausführen, dann würden Sie sagen:

> dispatch11:assembly 
[info] HelloWorldSpec 
[info] 
[info] The 'Hello world' string should 
[info] + contain 11 characters 
[info] 
[info] Total for specification HelloWorldSpec 
[info] Finished in 17 ms 
[info] 1 examples, 0 failure, 0 error 
[info] Passed: Total 1, Failed 0, Errors 0, Passed 4 
[info] Including: scopt_2.10-3.0.0.jar 
[info] Including: slf4j-api-1.6.2.jar 
[info] Including: netty-3.6.3.Final.jar 
[info] Including: scala-library.jar 
[info] Including: async-http-client-1.7.16.jar 
[info] Including: dispatch-core_2.10-0.11.0.jar 
[warn] Merging 'META-INF/NOTICE.txt' with strategy 'rename' 
[warn] Merging 'META-INF/license' with strategy 'rename' 
[warn] Merging 'META-INF/LICENSE.txt' with strategy 'rename' 
[warn] Merging 'META-INF/MANIFEST.MF' with strategy 'discard' 
[warn] Strategy 'discard' was applied to a file 
[warn] Strategy 'rename' was applied to 3 files 
[info] Checking every *.class/*.jar file's SHA-1. 
[info] SHA-1: xxxxxxxxxxxx 
[info] Packaging /Users/foo/helloworld/target/scala-2.10/helloworld-assembly-dispatch11_0.1-SNAPSHOT.jar ... 
[info] Done packaging. 
+0

Es muss hinzugefügt werden, dass dies scheint arbeiten ab Mitte 2013 mit sbt 0.13.0 und sbt-assembly 0.9.0, jedoch nicht mit zeitgemäßen Versionen. –