Подтвердить что ты не робот

Как установить свойства системы для runMain в командной строке?

Как установить системное свойство для runMain после его выполнения из командной строки в Windows?

Я хотел бы иметь возможность запускать следующую команду:

sbt -Dconfig.resource=../application.conf "runMain akka.Main com.my.main.Actor"

Независимо от того, является ли fork истинным, помещаю ли я его в SBT_OPTS или как я его передаю, я не могу этого сделать. Я знаком с Значение параметра установки в командной строке, когда значение по умолчанию, заданное в сборке? и Установка системных свойств с помощью "sbt run" , но не отвечают на мой вопрос.

Другие вопросы, похоже, указывают на то, что вы даже не можете легко просмотреть аргументы вызова Java в SBT. Любая помощь приветствуется.

4b9b3361

Ответ 1

Это работает:

sbt '; set javaOptions += "-Dconfig.resource=../application.conf" ; runMain akka.Main com.my.main.Actor'

Если это не достаточно "дружественный" синтаксис, оберните его в маленькую оболочку script.

(Обратите внимание, что предполагается, что для fork установлено значение true. Если вы этого не сделаете, см. комментарий akauppi.)

Ответ 2

Вы можете использовать настройку envVars. Я не уверен, насколько идиоматично это в SBT.

> help envVars
Environment variables used when forking a new JVM

Следующий (очень минималистический) build.sbt работал нормально.

fork := true

envVars := Map("msg" -> "hello")

Как только вы его запустили, установка envVars на любое значение с помощью set делает трюк.

> help set
set [every] <setting-expression>

        Applies the given setting to the current project:
          1) Constructs the expression provided as an argument by compiling and loading it.
          2) Appends the new setting to the current project settings.
          3) Re-evaluates the build settings.

        This command does not rebuild the build definitions, plugins, or configurations.
        It does not automatically persist the setting(s) either.
        To persist the setting(s), run 'session save' or 'session save-all'.

        If 'every' is specified, the setting is evaluated in the current context
        and the resulting value is used in every scope.  This overrides the value
        bound to the key everywhere.

У меня есть простое приложение для запуска.

$ sbt run
[info] Set current project to fork-testing (in build file:/C:/dev/sandbox/fork-testing/)
[info] Running Hello
[info] hello

При изменении параметра envVars в командной строке выход изменится следующим образом:

$ sbt 'set envVars := Map("msg" -> "Hello, Chad")' run
[info] Set current project to fork-testing (in build file:/C:/dev/sandbox/fork-testing/)
[info] Defining *:envVars
[info] The new value will be used by *:runner, compile:run::runner and 1 others.
[info]  Run `last` for details.
[info] Reapplying settings...
[info] Set current project to fork-testing (in build file:/C:/dev/sandbox/fork-testing/)
[info] Running Hello
[info] Hello, Chad

runMain в этом случае не отличается от run.

$ sbt 'set envVars := Map("msg" -> "Hello, Chad")' 'runMain Hello'
[info] Set current project to fork-testing (in build file:/C:/dev/sandbox/fork-testing/)
[info] Defining *:envVars
[info] The new value will be used by *:runner, compile:run::runner and 1 others.
[info]  Run `last` for details.
[info] Reapplying settings...
[info] Set current project to fork-testing (in build file:/C:/dev/sandbox/fork-testing/)
[info] Running Hello
[info] Hello, Chad

Ответ 3

Если вы пытаетесь установить свойства SBT, такие как настройки плагина, то приведенное выше не будет работать (AFAICT) с 0.13+ в моем опыте. Следующее, однако, работало при попытке передать настройки Liquibase, такие как пароль, из наших инфраструктур CI.

В вашем файле build.sbt

Ужасно, но поставляет значения по умолчанию и, возможно, захватывает System.properties. Таким образом, у вас есть дела по умолчанию и переопределенные случаи.

def sysPropOrDefault(propName:String,default:String):String = Option(System.getProperty(propName)).getOrElse(default)

liquibaseUsername := sysPropOrDefault("liquibase.username","change_me")
liquibasePassword := sysPropOrDefault("liquibase.password","chuck(\)orris")

Из командной строки

Теперь просто переопределяйте через -Dprop=value, как и с Maven или другими программами JVM. Перед выполнением задачи SBT появляются реквизиты примечаний.

sbt -Dliquibase.password="shh" -Dliquibase.username="bob" liquibase:liquibase-update