Несколько основных классов со сборкой SBT

Я хочу создать банки для AWS Lambda для выполнения рабочих задач. В настоящее время мой файл 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 собирает модуль service в банку для моего API, и это работает нормально. Однако модуль job будет иметь несколько классов Main (одно задание пр.), и когда я запускаю sbt assembly job, модуль service также собирается (даже если он не зависит от него).

Как я могу настроить свою установку, чтобы собирать модуль job только при необходимости и указывать отдельные основные классы как отдельно собранные jar-файлы?


person Andreas Jarbol    schedule 16.01.2018    source источник


Ответы (2)


Установите mainClass in assembly в job, чтобы определить, какой основной класс использовать, и запустите job/assembly, чтобы просто собрать jar сборки задания.

person Dale Wijnand    schedule 16.01.2018
comment
Спасибо за ваш быстрый ответ. Это работает только для сборки рабочего модуля. Как я могу настроить sbt для использования нескольких сетей, каждый из которых генерирует банку? - person Andreas Jarbol; 16.01.2018
comment
Самый простой способ - создать несколько проектов, которые зависят от job, а затем либо каждый из них содержит свой собственный основной (конфигурация не требуется), либо каждый настраивает свой основной, который определяется проектом job. - person Dale Wijnand; 17.01.2018
comment
@DaleWijnand есть ли где-нибудь пример этого? - person CpILL; 13.02.2019
comment
@CpILL вот один, который я нашел на GitHub: github.com/non/zillionaire /блоб/ - person Dale Wijnand; 13.02.2019

Вам нужно будет переопределить основной класс по умолчанию во время сборки, установив свойство явно.

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

Не уверен, что это хорошая практика, но в качестве альтернативы вы можете определить подпроект для каждого задания с правильным набором основного класса.

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)
person Shane Perry    schedule 16.01.2018