scala sbt sbt-assembly

scala - MĂșltiples archivos jar ejecutables con diferentes dependencias externas de un solo proyecto con sbt-assembly



(1)

El concepto de perfil de Maven se traduce en sbt / Ivy como configuración. Puede definir la configuración dentro de una configuración y hacer que sbt-assembly genere dos archivos jar. Puede agregar libraryDependency a una configuración específica agregando % "config" . Sin embargo, esto requiere que el proyecto esté al tanto de las configuraciones por adelantado.

En build.sbt (requiere sbt 0.13.0 o superior):

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

Para ejecutar la tarea de ensamblaje dentro de la configuración, diría:

> 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.

Tengo un solo proyecto scala construido con sbt usando un archivo build.scala. Puedo usar sbt-assembly para generar un solo archivo jar ejecutable de este proyecto sin ningún problema. Ahora quiero generar múltiples archivos jar ejecutables, donde cada archivo incluye un conjunto común de dependencias base internas y externas junto con diferentes dependencias externas .

¿Es esto posible con la versión actual de sbt-assembly? En maven esto es fácil, ya que uno puede definir múltiples perfiles en el pom, cada uno genera un tarro separado, pero en sbt-assembly usted pasa la configuración del conjunto a su proyecto y no he encontrado una manera de modificar la configuración para generar múltiples archivos jar.