使用 sbt-assembly 来自单个项目的具有不同外部依赖项的多个可执行 jar 文件 [英] Multiple executable jar files with different external dependencies from a single project with sbt-assembly

查看:12
本文介绍了使用 sbt-assembly 来自单个项目的具有不同外部依赖项的多个可执行 jar 文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a single scala project built with sbt using a build.scala file. I can use sbt-assembly to generate a single executable jar file from this project without problem. Now I want to generate multiple executable jar files, where each file includes a common set of internal and external base dependencies along with different external dependencies.

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

Is this possible with the current version of sbt-assembly? In maven this is easy, as one can define multiple profiles in the pom, each generating a separate jar, but in sbt-assembly you pass the assembly settings to your project and I haven't figured out a way to modify the settings to generate multiple jar files.

推荐答案

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

The concept of Maven profile translates in sbt/Ivy as configuration. You can define settings within a configuration and have sbt-assembly generate two jars. You can add libraryDependency to a specific configuration by adding % "config". This, however requires the project to be aware of the configuration(s) upfront.

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

In build.sbt (requires sbt 0.13.0 or above):

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

要在配置中运行组装任务,你会说:

To run assembly task within the configuration, you'd say:

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

这篇关于使用 sbt-assembly 来自单个项目的具有不同外部依赖项的多个可执行 jar 文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆