如何在子项目中使用 sbt native packager (sbt 0.13)

Posted

技术标签:

【中文标题】如何在子项目中使用 sbt native packager (sbt 0.13)【英文标题】:How to use sbt native packager with subprojects (sbt 0.13) 【发布时间】:2013-12-29 20:20:10 【问题描述】:

我有一个包含大量子项目和外部库依赖项的 sbt 项目。 build.sbt 是这样的:

val extlib1 = "xy.xxx" % "lib1" % "1.0+"
val extlib2 = "xy.yyy" % "lib2" % "1.0+"
val extlib3 = "xy.zzz" % "lib3" % "1.0+"

lazy val core=project settings (
  name:="cor",
  libraryDependencies++=Seq(extlib1)
)

lazy val servercore=project settings (
  name:="srvcore",
  libraryDependencies++=Seq(extlib1,extlib2)
) dependsOn(core)

lazy val masterserver=project settings (
  name:="mastersrv",
  mainClass:=Some("masterserver")
) dependsOn(servercore)

lazy val otherserver=project settings (
  name:="othersrv",
  libraryDependencies++=Seq(extlib3),
  mainClass:=Some("otherserver")
) dependsOn(servercore)

// Only for aggregating the builds of the subprojects
lazy val root=project in file(".") settings(name:="proj") aggregate(
  core,servercore,masterserver,otherserver
)

所以实际上该项目创建了几个程序(“masterserver”、“otherserver”),它们依赖于外部库和该项目本身的子项目的子集。

我想要的是启动主服务器或其他服务器所需的一整套 JAR,为每个单独的。所以,我想拥有例如masterserver/target/<whatever>包含

mastersrv.jar
srvcore.jar   (needed by mastersrv.jar)
cor.jar       (needed by srvcore.jar)
lib1.jar      (needed by mastersrv and srvcore)
lib2.jar      (needed by srvcore)
<whatever>.jar  (further libs needed by lib1 or lib2)

和具有相似内容的otherserver/target/&lt;whatever&gt;(它还必须添加lib3.jar,因为othersrv.jar 需要这样做。

如何做到这一点?我可以使用本机打包程序执行此操作吗?在根项目中发出stage 没有任何作用(因为没有mailClass?)。发出masterserver/state 会给出错误消息

> masterserver/stage
[error] No such setting/task
[error] masterserver/stage
[error]                   ^

我必须承认,我并没有从本地打包程序插件文档中得到真正的线索。如何归档我想要的内容?

编辑:当然,我不受目录东西的约束。如果我在 target 主目录中获得多个 ZIP 文件,也可以。我只想在一个位置拥有子项目的所有依赖项。

编辑 2:好的,我知道了 Play!框架正是我想要的。它使用 sbt 本机打包程序。如何在使用 Java 作为编程语言的非 Play sbt 处理的项目中归档子项目的递归通用打包?

【问题讨论】:

【参考方案1】:

好吧,一旦我进行了一些测试,答案就很简单了。首先,把原生打包器放到project-globalproject/plugins.sbt

addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "0.6.4")

然后,将原生打包器的配置放在子项目build.sbt中。在上面的示例中,将以下内容放入masterserver/build.sbt

// Setup the packager
packageArchetype.java_application

// Enable JAR export for staging
exportJars := true

所需的JAR文件集将被放入子项目的target目录,在本例中为masterserver/target/universal/stage/lib

子项目的其余配置可以留在全局build.sbt,但是我发现没有办法配置原生打包器。

【讨论】:

感谢您的自我回答。我发现它很有帮助:) 这个答案可能应该更新以反映在sbt-native-packager 的 1.x 行中使用的 sbt AutoPlugin 设施。 嗯,的确,答案现在已经有两年多了。不幸的是,从那以后我们没有改变或更新我们的工具链,所以我必须承认我没有使用 AutoPlugin 的经验。 :-(

以上是关于如何在子项目中使用 sbt native packager (sbt 0.13)的主要内容,如果未能解决你的问题,请参考以下文章

如何在多个项目中使用 sbt-native-packager

如何使用 sbt-native-packager 创建基本项目设置

如何在具有多个电源的单个模块项目中设置 sbt-native-packager

如何使用 sbt-native-packager 设置 docker 镜像名称

使用 sbt-native-packager 为我的 sbt 项目获取 docker 支持时出错

Scala SBT - sbt-native-packager,如何指定自定义阶段目录