Playframework sbt多个本机软件包

Playframework sbt多个本机软件包,playframework,sbt,sbt-native-packager,Playframework,Sbt,Sbt Native Packager,所以使用Scala Play框架。我有一个单一的代码库,但需要以两种方式启动它。一种方法是以PlayNetty为主类启动,并运行一个Web服务器。第二种方法将运行我自己的主类,并做不同的事情 如果我玩dist() 它最终使用了sbt本机插件,并创建了一个新的zip。在这个zip中有一个脚本,它用一个main类Netty调用java。这最终来自于 mainClass in (Compile, run) := Some("play.core.server.NettyServer"), Play

所以使用Scala Play框架。我有一个单一的代码库,但需要以两种方式启动它。一种方法是以PlayNetty为主类启动,并运行一个Web服务器。第二种方法将运行我自己的主类,并做不同的事情

如果我玩dist()

它最终使用了sbt本机插件,并创建了一个新的zip。在这个zip中有一个脚本,它用一个main类Netty调用java。这最终来自于

  mainClass in (Compile, run) := Some("play.core.server.NettyServer"),
PlaySettings.scala的内部

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

我开始尝试制作子项目。。但我不确定这是我真正想要的。比如:

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模板,添加mainClass作为参数,并将其传递给启动脚本…

您可以使用一个主类作为默认类并传递
-main you.other.class.Name

参数来运行另一个主类

我认为这与真正的sbt本机包装工程。但据我所知,剧本的开始脚本去掉了-main参数。在播放生成的开始脚本中,我有
declare-r app\u mainclass=“play.core.server.NettyServer”
。因此,一个选项是尝试找出在游戏中生成的位置,并像sbt native通常那样将main类作为参数。在run()函数中,如果[-n“$custom_mainclass”],您应该具有
if[-n“$custom_mainclass”];然后
mainclass=“$custom\u mainclass”
else
mainclass=“$app\u mainclass”
fi
和声明的
app\u mainclass
选项在启动期间将被忽略,该选项不在play 2.3.9通过
play dist
生成的运行函数中。。但我没有看到他们是如何将其删除的,因此也没有看到我将如何将其恢复到正常的play native软件包风格。。您发布的内容非常理想。请查看从237到255的行。这是播放生成的文件的样子:```如果[[!$no\u version\u check]],请检查java版本;然后是java版本检查fi现在我们检查环境中是否有java选项。首先列出它们,脚本可以覆盖它们。如果[[“$JAVA_OPTS”!=”];然后java_opts=“${java_opts}”fi```