Используя sbt-native-packager, как я могу просто добавить каталог к ​​моему сценарию bash ${app_classpath}?

В моем проекте используется sbt-native-packager с packageArchetype.java_application. На этапе sbt у меня есть задача, которая создает некоторый окончательный файл конфигурации в стиле Typesafe, который я затем копирую в:

target/universal/stage/conf/application.conf

Я хотел бы добавить этот каталог к ​​пути к классам среды выполнения в сценарии bash, и я ищу самый простой способ сделать это. Я бы не хотел поддерживать отдельный src/main/templates/bash-template для чего-то такого простого, и я не вижу, как это сделать иначе.

Спасибо!


person bloo    schedule 31.03.2014    source источник


Ответы (3)


Короткий ответ

Определить сопоставление пакетов

mappings in Universal <+= (packageBin in Compile, sourceDirectory ) map { 
    (_, src) =>
    // we are using the reference.conf as default application.conf
    // the user can override settings here
    val conf = src / "main" / "resources" / "reference.conf"
    conf -> "conf/application.conf"
}

Создайте jvmopts в src/universal/conf с

-Dconfig.file=/<installation-path>/conf/application.conf

Добавить в build.sbt

bashScriptConfigLocation := Some("${app_home}/../conf/jvmopts")

Пример для server_archetype: используйте пример приложения. Небольшое описание можно найти здесь.

Длинный ответ

Изменение пути к классам не поддерживается непосредственно sbt-native-packager, поскольку это может вызвать такие проблемы, как

  • порядок путей к классам
  • проблемы с безопасностью

Как и Typesafe Config, большинство библиотек, использующих файлы конфигурации, предоставляют параметр для определения местоположения файла конфигурации. Используйте параметры, описанные в документации.

Похоже, вы пытаетесь запустить сервер, что означает, что вы можете использовать

packageArchetype.java_server

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

person Muki    schedule 02.04.2014
comment
вместо создания src/universal/conf/jvmopts в build.sbt можно добавить следующий код: bashScriptExtraDefines += """addJava "-Dconfig.file=${app_home}/../conf/application.conf"""" - person Trev; 13.12.2014
comment
Чтобы сгенерированный bat-файл работал в Windows, также добавьте следующее в build.sbt. batScriptExtraDefines += """call :add_java "-Dconfig.file=%APP_HOME%\conf\application.conf"""" - person user5698801; 22.03.2018

Следующая настройка:

scriptClasspath in bashScriptDefines ~= (cp => "../conf" +: cp),

Позволяет делать именно то, что вам нужно.

В этом конкретном примере я добавляю каталог «../conf» к записям пути к классам.

Кроме того, вам необходимо импортировать следующие ключи конфигурации в вашу сборку SBT:

import com.typesafe.sbt.packager.Keys.bashScriptDefines
import com.typesafe.sbt.packager.Keys.scriptClasspath
person RoyB    schedule 26.09.2016
comment
Н.Б. можно добавлять только относительные пути - person Alexander Vasiljev; 13.01.2017
comment
В SBT 1.2 мне нужен был только один импорт: import NativePackagerHelper._ - person Igor Urisman; 11.07.2019

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

Это очень хакерский и хрупкий в том смысле, что он, вероятно, сломается, если/когда sbt-native-packager внесет изменения в способ генерации скрипта, но пока это работает для меня:

private lazy val ClasspathPattern = "declare -r app_classpath=\"(.*)\"\n".r

bashScriptDefines :=  bashScriptDefines.value.map {
                              case ClasspathPattern(classpath) => "declare -r app_classpath=\"/path/to/some/external/lib/*:" + classpath + "\"\n"
                              case _@entry => entry
                          },
person ishaaq    schedule 03.04.2014
comment
Вот что мне нужно сделать. Появился ли лучший способ за последние пять лет? - person Troy Daniels; 27.08.2019