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

时间:2014-07-31 13:04:26

标签: scala sbt-native-packager

我目前正在使用sbt-native-packager为我的scala应用程序生成启动脚本。我正在使用packageArchetype.java_application。我在sbt:

中创建脚本
sbt clean myproject/stage

然后"安装"通过将创建的libbin目录复制到安装目录来创建应用程序。我没有将它分发给任何人,所以我没有创建可执行jar或tarball或类似的东西。我只是编译我的类,并将我的jar和所有库依赖项jar放在一个地方,以便启动脚本可以执行。

现在我想在我的应用程序中添加第二个主类,所以当运行target/universal/stage/bin时,我希望第二个启动脚本出现在sbt stage中。我希望它将是相同的脚本,但名称不同,app_mainclass设置为不同的类。我该怎么做?

3 个答案:

答案 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生成转发器脚本。

  •