多个 main 类 与 SBT 装配

Multiple main classes with SBT assembly

我正在为 AWS Lambda 创建 jar 以 运行 工作任务。目前我的 build.sbt 文件看起来像这样:

lazy val commonSettings = Seq(...)

lazy val core = project
    .settings(commonSettings: _*)

lazy val job = project
    .settings(commonSettings: _*)
    .dependsOn(core)

lazy val service = project
    .settings(commonSettings: _*)
    .settings(
        mainClass in assembly := Some("io.example.service.Lambda"),
        assemblyJarName in assembly := "lambda.jar"
    )
    .dependsOn(core)

运行 sbt assembly assemble 将 service 模块放入我的 API 的罐子中,效果很好。然而,模块 job 将有多个 Main 类 (一个 pr. 作业),当我 运行 sbt assembly jobservice 模块也是 assembled(即使它不依赖)。

如何在需要时将我的设置配置为仅 assemble job 模块,并将各个 mainClasses 单独指定为 assembled jar?

job 中设置 mainClass in assembly 以定义要使用的主要 class,运行 job/assembly 仅 assemble 作业程序集罐子。

您需要在构建时通过显式设置 属性 来覆盖默认的 main class。

sbt "; set mainClass in assembly := Some("another/class"); job/assembly"

不确定这是好的做法,但您也可以为每个作业定义一个子项目,并设置正确的主要 class。

lazy val job1 = project
    .settings(commonSettings: _*)
    .settings(
        mainClass in assembly := Some("io.example.service.Lambda"),
        assemblyJarName in assembly := "lambda.jar"
    )
    .dependsOn(core)

lazy val job2 = project
    .settings(commonSettings: _*)
    .settings(
        mainClass in assembly := Some("io.example.service.Lambda2"),
        assemblyJarName in assembly := "lambda2.jar"
    )
    .dependsOn(core)