sbt - 如何在子项目中使用 sbt 原生打包器 (sbt 0.13)

标签 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 所需要的。

怎么做?我可以使用 native 打包程序执行此操作吗?发行stage在根项目中什么都不做(因为没有 mailClass ?)。发行masterserver/state给出错误信息
> masterserver/stage
[error] No such setting/task
[error] masterserver/stage
[error]                   ^

我必须承认,我没有从 native 打包器插件文档中得到真正的线索。我怎样才能存档我想要的东西?

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

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

最佳答案

好吧,一旦我测试了一下,答案就很简单了。首先,将原生打包器放入项目-全局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 ,但我发现无法以这种方式配置 native 打包程序。

关于sbt - 如何在子项目中使用 sbt 原生打包器 (sbt 0.13),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20526275/

相关文章:

scala - sbt 项目解决依赖很慢

java - sbt 中的工作目录

scala - 使用 sbt 和 Akka 微内核运行应用程序

scala - 如何在 sbt 多项目中使用 docker 任务

Scala,docker - 如何使用 sbt-native-packager 在多模块应用程序中设置 mainClass?

scala - 设置 sbt 程序集 v0.14.2 时出现问题

scala - 学习 Scala 作为第一个 VM/编译语言 - 工作流挑战

scala - 找不到PlayEbean Play 2.5.x

scala - 如何让 sbt 的 Jetty 使用本地域名?

scala - 为什么 sbt-native-packager 在分发包中生成一个硬编码的顶级父目录?