使用 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 += ...
)
我见过这个问题的近似变体,但没有包含所有有用信息的答案。
使用 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 += ...
)