我目前正在使用sbt-native-packager为我的scala应用程序生成启动脚本。我正在使用packageArchetype.java_application
。我在sbt:
sbt clean myproject/stage
然后"安装"通过将创建的lib
和bin
目录复制到安装目录来创建应用程序。我没有将它分发给任何人,所以我没有创建可执行jar或tarball或类似的东西。我只是编译我的类,并将我的jar和所有库依赖项jar放在一个地方,以便启动脚本可以执行。
现在我想在我的应用程序中添加第二个主类,所以当运行target/universal/stage/bin
时,我希望第二个启动脚本出现在sbt stage
中。我希望它将是相同的脚本,但名称不同,app_mainclass
设置为不同的类。我该怎么做?
答案 0 :(得分:3)
sbt-native-packager生成的脚本允许您传入-main
参数以指定要运行的主类。这是我为名为foo
的项目做的事情:
使用您想要调用sbt-native-packager生成的脚本的任何常用选项创建run.sh
脚本:
#!/bin/bash
./target/universal/stage/bin/foo -main "$@"
然后我为每个要运行的主类创建一个单独的脚本。例如first.sh
:
#!/bin/bash
export JAVA_OPTS="-Xms512m -Xmx512m"
./run.sh com.example.FirstApp -- "$@"
和second.sh
:
#!/bin/bash
export JAVA_OPTS="-Xms2048m -Xmx2048m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC"
./run.sh com.example.SecondApp -- "$@"
答案 1 :(得分:2)
现在不支持多个主要类。作为一种解决方法,您可以使用单个主类并检查命令行参数。 启动你的应用:
myApp prog1
在你的主要课程中:
def main(args: Array[String]): Unit = {
if(args[0] == "prog1")
Programm1.start()
else
Programm2.start()
}
答案 2 :(得分:2)
现在支持多个主要类(2016年第4季度,本机包1.2.0)
参见" SBT Native Packager 1.2.0"通过 Muki Seiler
单个项目 - 多个应用
初学者的一个主要难点是创建起始脚本。 bash和bat启动脚本仅在存在
时生成
- 正好一个主要课程
- 使用
明确设置主类
mainClass in Compile := Some(“com.example.MainClass”)
对于1.2.x,我们将默认扩展实现并支持多个主类。
Native packager将为类路径中找到的每个主类生成一个启动脚本 SBT通过
discoveredMainClasses
任务中的Compile
提供这些内容 如果只有一个主类,SBT会将其分配给编译设置中的mainClass
。这导致了三种情况:
正好是一个主要类 在这种情况下,native-packager将表现得像以前的版本一样,只使用脚本名称的
executableScriptName
设置生成一个启动脚本。
Compile := None
中的多个主要类和mainClass 这是SBT定义的默认行为。在这种情况下,native-packager将为每个主类生成相同的启动脚本。
Compile := Some(…)
中的多个主要类和mainClass 用户已设置特定的主类,这将导致使用executableScriptName
设置生成主启动脚本。对于所有其他主类,native-packager生成转发器脚本。