使用 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-assembly
或sbt-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 可以为一个项目生成多个启动脚本吗?