使用 SBT 创建多个工件

Creating multiple artifacts with SBT

我见过这个问题的近似变体,但没有包含所有有用信息的答案。

使用 sbt 0.13.13 和 sbt-assembly 0.14.3,以及基于 http://www.scala-sbt.org/0.13/docs/Multi-Project.html 的多项目 build.sbt,如下所示:

lazy val commonSettings = Seq(
  version := "2.3.0",
  scalaVersion := "2.10.6"
)

lazy val config_jar = (project in file(".")).
  settings(commonSettings: _*).
  settings(
    name := "myapp-config",
    test in assembly := {},
    assemblyJarName in assembly := "myapp-config.jar",
    includeFilter in Compile := "myapp.conf"
  )

lazy val build_jar = (project in file(".")).
  settings(commonSettings: _*).
  settings(
    name := "myapp",
    excludeFilter in Compile := "myapp.conf",
    libraryDependencies += ...
  )

这个配置是否足以构建两个独立的 jar?构建每个的完整 sbt 命令到底是什么 或者两者都来自命令行?命令 sbt projects 仅显示 build_jar,因此缺少某些内容。

几条评论:

  • 您的项目需要指向不同的路径。目前都指向根 (file(".")) 目录。

  • 程序集将可用于两个项目,因此您可以从每个项目调用 assembly 命令。

  • 为什么要使用 Scala 2.10?至少(如果你说的是混合 Scala/Java 项目和堆栈 Java 7),请使用 Scala 2.11.8。

  • 想要一个项目一统天下,就需要一个聚合项目。从 root 调用 assembly 将可以在其他两个项目中的每一个中 assembly(从而创建你的两个 jar)。

所以我会写:

lazy val commonSettings = Seq(
  version := "2.3.0",
  scalaVersion := "2.10.6"
)

lazy val root = (project in file(".")).aggregate(config_jar, build_jar)   

lazy val config_jar = (project in file("config")).
  settings(commonSettings: _*).
  settings(
    name := "myapp-config",
    test in assembly := {},
    assemblyJarName in assembly := "myapp-config.jar",
    includeFilter in Compile := "myapp.conf"
  )

lazy val build_jar = (project in file("build")).
  dependsOn(config_jar).
  settings(commonSettings: _*).
  settings(
    name := "myapp",
    assemblyMergeStrategy in assembly := { file =>
        if(file.startsWith("config\")) MergeStrategy.discard else MergeStrategy.defaultMergeStrategy(file)
    },
    libraryDependencies += ...
  )