Comment définir les propriétés système pour runMain sur la ligne de commande?

Comment puis-je définir une propriété système pour runMain lors de son exécution à partir de la ligne de commande sous Windows?

J'aimerais pouvoir exécuter la commande suivante:

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

Peu importe si fork est vrai, que je le mette dans SBT_OPTS, ou comment je le passe, Je ne peux pas accomplir cela. Je suis familier avec les deux valeur de réglage de la ligne de commande lorsqu'aucune valeur par défaut n'est définie dans build? et définir les propriétés du système avec "sbt run" mais ni répondre à mon question.

D'autres questions semblent indiquer que vous ne pouvez même pas facilement afficher les arguments D'invocation Java facilement dans SBT. Toute aide est appréciée.

37
sbt
demandé sur Community 2014-01-27 23:02:41

3 réponses

Cela fonctionne:

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

Si ce n'est pas une syntaxe assez "conviviale", enveloppez-la dans un petit script shell.

(notez que cela suppose que vous avez fork défini sur true pour l'exécution. Si vous ne le faites pas, consultez le commentaire d'akauppi.)

36
répondu Seth Tisue 2015-07-10 17:34:05

Vous pouvez utiliser le paramètre envVars. Je ne sais pas à quel point c'est idiomatique dans SBT, cependant.

> help envVars
Environment variables used when forking a new JVM

Ce qui suit (très minimaliste) build.sbt a bien fonctionné.

fork := true

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

Une fois que vous l'avez exécuté, définir envVars à n'importe quelle valeur avec set fait l'affaire.

> 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's settings.
          3) Re-evaluates the build's 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.

, j'ai une application simple à exécuter.

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

Avec le paramètre envVars modifié sur la ligne de commande, la sortie changerait comme suit:

$ 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 n'est pas différent de run dans ce cas.

$ 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
16
répondu Jacek Laskowski 2014-01-28 15:30:31

Si vous essayez de définir des propriétés SBT, comme les paramètres du plugin, alors ce qui précède ne fonctionnera pas (AFAICT) à partir de 0.13+ dans mon expérience. Ce qui suit a cependant fonctionné, en essayant de passer dans les paramètres Liquibase, comme le mot de passe, à partir de nos frameworks CI.

Dans votre construction.sbt

Laid, mais fournit les valeurs par défaut, et éventuellement saisit du système .propriétés. De cette façon, vous avez couvert vos cas par défaut et de remplacement.

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")

Depuis la ligne de commande

Maintenant juste remplacer via -Dprop=value comme vous le feriez avec Maven ou d'autres programmes JVM. Remarque les accessoires apparaissent avant la tâche SBT.

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

6
répondu Joseph Lust 2016-06-02 16:30:48