Может ли sbt-native-packager генерировать несколько сценариев запуска для одного проекта?

В настоящее время я использую sbt-native-packager для создания сценария запуска для мое скала-приложение. Я использую packageArchetype.java_application. Я создаю скрипт в sbt:

sbt clean myproject/stage

а затем «установить» приложение, скопировав созданные каталоги lib и bin в каталог установки. Я никому не распространяю его, поэтому я не создаю исполняемый файл jar или tarball или что-то в этом роде. Я просто компилирую свои классы и помещаю свою банку и все файлы зависимостей библиотеки в одно место, чтобы стартовый скрипт мог выполняться.

Теперь я хочу добавить в свое приложение второй основной класс, поэтому я хочу, чтобы второй сценарий запуска появлялся в target/universal/stage/bin при запуске sbt stage. Я ожидаю, что это будет тот же скрипт, но с другим именем и app_mainclass, установленным для другого класса. Как бы я это сделал?


person Adam Mackler    schedule 31.07.2014    source источник


Ответы (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 -- "$@"
person tpunder    schedule 05.11.2015

Наличие нескольких основных классов... теперь поддерживается (Q4 2016, родной пакет 1.2.0)

См. "SBT Native Packager 1.2.0" автор Муки Сейлер

Один проект — Несколько приложений

Основной проблемой для начинающих является создание стартового сценария. Сценарии запуска bash и bat генерируются только при наличии

  • Ровно один основной класс
  • Явно установите основной класс с помощью
     mainClass in Compile := Some(“com.example.MainClass”)

Для версии 1.2.x мы расширим реализацию и по умолчанию будем поддерживать несколько основных классов.

Собственный упаковщик создаст сценарий запуска для каждого основного класса, найденного в пути к классам.
SBT предоставляет их с помощью задачи discoveredMainClasses в Compile.
Если есть только один основной класс, SBT назначит его mainClass в настройках компиляции. Это приводит к трем случаям:

  • Только один основной класс.
    В этом случае native-packager будет вести себя как предыдущие версии и просто сгенерирует один стартовый скрипт, используя параметр executableScriptName для имени скрипта.

  • Несколько основных классов и mainClass в Compile := None.
    Это поведение по умолчанию, определенное SBT. В этом случае native-packager сгенерирует один и тот же стартовый скрипт для каждого основного класса.

  • Несколько основных классов и mainClass в Compile := Some(…).
    Пользователь установил определенный основной класс, что приведет к созданию основного сценария запуска с использованием параметра executableScriptName. Для всех остальных основных классов native-packager генерирует скрипты пересылки.

person VonC    schedule 12.11.2016
comment
Можно ли предотвратить создание сценариев пересылки при наличии нескольких основных классов и mainClass in Compile := Some(…)? - person Andrew Bate; 07.12.2017
comment
@AndrewBate Этого я не знаю: не могли бы вы задать это как независимый вопрос, чтобы другие могли на него взглянуть? - person VonC; 07.12.2017
comment
Спасибо, что также упомянули, в какой версии это начало поддерживаться (1.2.0), так как я использовал более старую версию, и это не сработало. - person JSelser; 19.01.2020

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

myApp prog1

В вашем основном классе:

def main(args: Array[String]): Unit = {
  if(args[0] == "prog1")
    Programm1.start()
  else 
    Programm2.start()
}
person kardapoltsev    schedule 01.08.2014
comment
Спасибо за информацию и предложение. Я только что добавил строку в свой сценарий установки, которая запускает сгенерированный сценарий запуска через sed, чтобы сделать копию, в которой изменена строка app_mainclass. - person Adam Mackler; 01.08.2014
comment
Есть ли планы поддержать это в ближайшем будущем? - person sebi; 19.06.2015
comment
Собственный упаковщик Sbt теперь поддерживает параметр -main в сценарии bash. app_name -main some.other.Main. - person kardapoltsev; 21.06.2015
comment
@kardapoltsev как? Любая ссылка на документацию? - person Malcolm; 13.10.2015
comment
Просто передайте параметр -main в стартовый скрипт. Несколько документов можно найти по адресу scala-sbt.org/sbt-native-packager. /архетипы - person kardapoltsev; 14.10.2015