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

时间:2013-12-11 17:44:35

标签: sbt sbt-native-packager

我有一个包含大量子项目和外部库依赖项的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/<whatever>(也必须添加lib3.jar,因为othersrv.jar需要这样做。

怎么做?我可以使用本机打包程序执行此操作吗?在根项目中发布stage什么都不做(因为没有mailClass?)。发出masterserver/state会显示错误消息

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

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

编辑:当然,我没有绑定目录的东西。如果我在主target目录中获得多个ZIP文件,那也是o.k.我只想在一个位置拥有子项目的所有依赖项。

编辑2:好的,我了解到了Play!框架完全符合我的要求。它使用sbt native packager。如何在使用Java作为编程语言的非Play sbt处理项目中实现子项目的递归通用打包?

1 个答案:

答案 0 :(得分:7)

嗯,一旦我测试了一下,答案就非常简单了。首先,将本机打包器放在项目全局project/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中,但我发现没办法以这种方式配置本机打包器。