sbt 多个原生包

sbt multiple native packages

所以使用 Scala Play Framework。我只有一个代码库,但需要以两种方式启动它。一种方法是将 Play Netty 作为主要 class 和 运行 网络服务器启动。第二种方式将 运行 我自己的主要 class 并做不同的事情。

如果我玩 dist (https://www.playframework.com/documentation/2.3.x/ProductionDist)

它最终使用了sbt-native插件,并制作了一个新的zip。在该 zip 文件中是一个脚本,它使用 Netty 的 mainclass 调用 java。这最终来自

  mainClass in (Compile, run) := Some("play.core.server.NettyServer"),

在 PlaySettings.scala 内。

我想保留所有这些,但将第二个工件添加到 dist.. 中,唯一不同的是不同的主 class。

我开始尝试制作子项目..但不确定这是我真正想要的。类似于:

lazy val root = Project(
  id = "root",
  base = file("."),
  librar
  aggregate = Seq(web, backend)

).dependsOn(web, worker)

lazy val web = Project(
  id = "web",
  base = file("."),
  settings = packageArchetype.java_server ++ Seq(
    name := "web",
    mainClass in Compile := Some("play.core.server.NettyServer")
  )
).enablePlugins(PlayScala)

lazy val backend= Project(
  id = "backend",
  base = file("."),
  settings = packageArchetype.java_server ++ Seq(
    name := "backend",
    mainClass in Compile := Some("com.foobar.BackendMain")
  )
)

但我最终还是得到了一件神器。还有哪些其他选择?

我可以破解 bash-template 并添加 mainClass 作为参数并将其传递给启动脚本...

您可以使用一个主 class 作为默认值并通过 -main you.another.class.Name bash 脚本的参数 运行 另一个主要 class。