2013-09-04 15 views
22

Tek bir scala projesinde, bir build.scala dosyası kullanarak sbt ile oluşturulmuş bir scala projem var. Bu projeden tek bir çalıştırılabilir jar dosyası oluşturmak için sbt-assembly'ı sorunsuz kullanabiliyorum. Şimdi, her dosyanın farklı harici bağımlılıklar ile birlikte dahili ve harici temel bağımlılıkların ortak bir kümesini içerdiği birden çok yürütülebilir jar dosyası oluşturmak istiyorum.Tek bir projeden farklı dış bağımlılıkları olan birden fazla yürütülebilir jar dosyası sbt-assembly ile

Bu, sbt-montajının geçerli sürümü ile mümkün mü? Maven'de bu, pomda birden fazla profili tanımlayabildiğinden, her biri ayrı bir jar üretebildiğinden kolay, ancak sbt-montajında ​​montaj ayarlarını projenize aktarıyorsunuz ve bu ayarları oluşturmak için ayarları değiştirmenin bir yolunu bulmuyorum. çoklu jar dosyaları.

cevap

17

Maven profili kavramı, yapılandırma olarak sbt/Ivy'de çevirir. Ayarları bir yapılandırma içinde tanımlayabilir ve sbt-assembly'ın iki kavanoz üretmesini sağlayabilirsiniz. % "config" ekleyerek belirli bir yapılandırmaya libraryDependency ekleyebilirsiniz. Bununla birlikte, bu, projenin önceden yapılandırma (lar) ından haberdar olmasını gerektirir. build.sbt yılında

(yukarıda 0.13.0 veya sbt gerektirir):

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

yapılandırma içindeki montaj görevi çalıştırmak için söyleyebilirim:

> 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. 
O eklenmelidir
+0

bu gibi görünüyor 2013'ün ortasından itibaren sbt 0.13.0 ve sbt-assembly 0.9.0 ile çalışmak, ancak çağdaş versiyonlarla değil. –