使用 sbt 运行多个应用程序

Posted

技术标签:

【中文标题】使用 sbt 运行多个应用程序【英文标题】:Running multiple applications with sbt 【发布时间】:2016-07-21 14:52:20 【问题描述】:

我的目录结构是这样设置的。

src/main/scala/main/Main.scala
src/main/scala/scripts/MainScript.scala

脚本是一个正在运行的后台作业。

我之前使用sbt-assembly 将主文件打包到要部署的jar 中,但我不确定如何使用sbt-assemblysbt-native-packager 创建两个单独的jar。我该怎么做?解决这个问题的最佳方法是什么?

我想做类似的事情。

java -jar main.jar $PORT
java -jar scriptMain.jar

【问题讨论】:

Sbt 原生打包器为您创建可部署的工件。您可以串联使用 Sbt 程序集和 Sbt 本机打包程序。我们为 spark 创建 rpm 包,使用 Sbt 程序集创建的 fat jar。 @Manas 是否可以在build.sbt 中使用sbt-assembly 编写解决方案以同时创建两个单独的JAR?我以前用它来创建一个 JAR。因为一旦有了这些,我就可以创建另一个文件来执行上述代码块中发生的事情。 @Manas 我应该创建一个多项目构建吗?所以我会在common 中有公共代码,在script 中有MainScript,在main 中有Main。并以这种方式构建 JAR? 不确定多项目构建将如何帮助您。我仍然会使用sbt-assembly 并使用两个脚本。一个打电话给main,另一个打电话给script。基本上,您最终会将相同的 jar 复制到两个包中。 【参考方案1】:

仅使用 native-packager 解决此问题的一种方法如下。

把你所有的主要课程放在src/main/scala 定义一个应该默认运行的mainClass in Compile := Some("foo.bar.Main") add additional scripts 在src/universal/bin 中,您想提供。这些脚本可以将native-packagerand set the-main参数生成的主脚本调用到你要调用的类中。

现在您有一个具有以下结构的输出包(例如 zip、rpm、deb)。假设您的应用名为 myApp 并且您提供给名为 otherApp1 / otherApp2

的其他 bin 脚本
lib/ (jars live here)
conf/ (configuration files here, if any)
bin/
  myApp
  otherApp1
  otherApp2

不幸的是,我没有脚本示例(我的 bash-foo 对于 SO 上的即时魔法还不够好)。最后,脚本(otherApp1、otherApp2)应该只是将它们收到的参数传递给原生打包脚本(myApp)。

an issue #633 提供了一种自动生成此类脚本的方法。

希望有帮助, 渚

【讨论】:

以上是关于使用 sbt 运行多个应用程序的主要内容,如果未能解决你的问题,请参考以下文章

sbt-native-packager 在不同的模块中定义多个 mainClasses

使用 sbt 构建的应用程序运行时出现 NoClassDefFoundError

sbt-native-packager 可以为一个项目生成多个启动脚本吗?

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

似乎无法在 SBT 中的分叉 JVM 中运行 Play 应用程序

如何配置 sbt 在运行应用程序时加载资源?