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