2013-09-04 43 views
22

Tôi có một dự án scala được xây dựng với sbt bằng cách sử dụng tệp build.scala. Tôi có thể sử dụng sbt-lắp ráp để tạo ra một tập tin jar thực thi duy nhất từ ​​dự án này mà không có vấn đề. Bây giờ tôi muốn tạo nhiều tệp jar thực thi, trong đó mỗi tệp bao gồm một bộ phụ thuộc cơ sở nội bộ và bên ngoài chung cùng với các phụ thuộc bên ngoài khác nhau.Nhiều tệp jar thực thi với các phụ thuộc bên ngoài khác nhau từ một dự án duy nhất với sbt-assembly

Điều này có thể thực hiện với phiên bản sbt-assembly hiện tại không? Trong maven, điều này rất dễ, vì người ta có thể định nghĩa nhiều profile trong pom, mỗi cái tạo một jar riêng biệt, nhưng trong sbt-assembly bạn chuyển các thiết lập assembly đến dự án của bạn và tôi đã không tìm ra cách sửa đổi các thiết lập để tạo ra nhiều tệp jar.

Trả lời

17

Khái niệm về cấu hình Maven dịch trong sbt/Ivy dưới dạng cấu hình. Bạn có thể định nghĩa các thiết lập trong một cấu hình và có sbt-assembly tạo ra hai lọ. Bạn có thể thêm thư việnDependency vào một cấu hình cụ thể bằng cách thêm % "config". Điều này, tuy nhiên yêu cầu dự án phải nhận thức được (các) cấu hình trả trước.

Trong build.sbt (yêu cầu SBT 0.13.0 trở lên):

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

Để chạy nhiệm vụ lắp ráp trong cấu hình, bạn muốn nói:

> 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

Phải nói thêm rằng điều này dường như làm việc với sbt 0.13.0 và sbt-assembly 0.9.0 từ giữa năm 2013, nhưng không phải với phiên bản hiện đại. –

Các vấn đề liên quan