5

我目前正在使用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设置为不同的类。我该怎么做?

4

3 回答 3

3

sbt-native-packager 生成的脚本允许你传入一个-main参数来指定你想要运行的主类。这是我为一个名为的项目所做的foo

run.sh使用您想要调用 sbt-native-packager 生成的脚本的任何常用选项创建一个脚本:

#!/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 -- "$@"
于 2015-11-05T17:15:08.497 回答
3

拥有多个主类......现在支持(2016 年第四季度,本机包 1.2.0)

请参阅Muki Seiler的“ SBT Native Packager 1.2.0

单个项目 - 多个应用程序

初学者的一个主要痛点是启动脚本的创建。bash 和 bat 启动脚本仅在存在

  • 正是一个主要课程
  • 显式设置主类
     mainClass in Compile := Some(“com.example.MainClass”)

对于 1.2.x,我们将扩展实现并默认支持多个主类。

本机打包程序将为在 classpath 中找到的每个主类生成一个启动脚本
SBT 通过discoveredMainClassesinCompile任务提供它们。
如果只有一个主类,SBT 会将其分配给mainClassin Compile 设置。这导致了三种情况:

  • 正是一门主课
    在这种情况下,native-packager 将像以前的版本一样运行,并且只生成一个启动脚本,使用executableScriptName脚本名称的设置。

  • 中的多个主类和主类Compile := None
    这是 SBT 定义的默认行为。在这种情况下,native-packager 将为每个主类生成相同的启动脚本。

  • 中的多个主类和主类Compile := Some(…)。用户设置了一个特定的主类,这将导致使用该设置
    生成一个主启动脚本。executableScriptName对于所有其他主要类,native-packager 生成转发器脚本。

于 2016-11-12T09:19:00.157 回答
2

现在不支持多个主类。作为一种解决方法,您可以使用单个主类并检查命令行参数。启动您的应用程序:

myApp prog1

在您的主要课程中:

def main(args: Array[String]): Unit = {
  if(args[0] == "prog1")
    Programm1.start()
  else 
    Programm2.start()
}
于 2014-08-01T06:51:03.380 回答