首页 文章

具有不同外部依赖关系的多个可执行jar文件来自具有sbt-assembly的单个项目

提问于
浏览
23

我有一个使用build.scala文件使用sbt构建的scala项目 . 我可以使用sbt-assembly从这个项目生成一个可执行的jar文件没有问题 . 现在我想生成多个可执行jar文件,其中每个文件包含一组通用的内部和外部基本依赖项以及不同的外部依赖项 .

当前版本的sbt-assembly有可能吗?在maven中这很容易,因为可以在pom中定义多个配置文件,每个配置文件生成一个单独的jar,但是在sbt-assembly中你将程序集设置传递给你的项目,我还没有想出一种方法来修改设置来生成多个jar文件 .

1 回答

  • 18

    Maven配置文件的概念在sbt / Ivy中作为配置进行转换 . 您可以在配置中定义设置,并让sbt-assembly生成两个jar . 您可以通过添加 % "config" 将libraryDependency添加到特定配置 . 但是,这需要项目预先了解配置 .

    build.sbt (要求sbt 0.13.0或以上):

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

    要在配置中运行程序集任务,您需要说:

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

相关问题