2013-09-04 9 views
22

Mam jeden projekt scala zbudowany z sbt przy użyciu pliku build.scala. Mogę użyć sbt-assembly do wygenerowania pojedynczego pliku wykonywalnego jar z tego projektu bez problemu. Teraz chcę wygenerować wiele plików wykonywalnych jar, gdzie każdy plik zawiera wspólny zestaw wewnętrznych i zewnętrznych zależności bazowych wraz z różnych zewnętrznych zależności.Wiele plików wykonywalnych jar z różnymi zależnościami zewnętrznymi z pojedynczego projektu z sbt-assembly

Czy jest to możliwe z aktualną wersją sbt-assembly? W maven jest to łatwe, ponieważ można zdefiniować wiele profili w pom, z których każdy generuje oddzielny słoik, ale w sbt-assembly przekazujesz ustawienia zespołu do projektu i nie znalazłem sposobu na modyfikację ustawień do wygenerowania wiele plików JAR.

Odpowiedz

17

Koncepcja profilu Maven przekłada się na konfigurację sbt/Ivy. Możesz zdefiniować ustawienia w konfiguracji i mieć sbt-assembly, by wygenerować dwa słoiki. Można dodać libraryDependency do konkretnej konfiguracji, dodając % "config". To jednak wymaga, aby projekt był świadom konfiguracji z góry.

W build.sbt (wymaga SBT 0.13.0 lub nowszej):

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 
)): _*) 

Aby uruchomić zadanie montażu w konfiguracji, można by powiedzieć:

> 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

Należy dodać, że to wydaje się pracuj z sbt 0.13.0 i sbt-assembly 0.9.0 od połowy 2013, ale nie we współczesnych wersjach. –

Powiązane problemy