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?
Je voudrais pouvoir exécuter la commande suivante:
sbt -Dconfig.resource=../application.conf "runMain akka.Main com.my.main.Actor"
Que fork
soit vrai, que je le mette dans SBT_OPTS
, ou comment je le transmets, je ne peux pas accomplir cela. Je connais à la fois Définition de la valeur de la configuration sur la ligne de commande lorsqu'aucune valeur par défaut n'est définie dans la construction? et Définition des propriétés système avec "sbt run" mais ni répondre à ma question.
D'autres questions semblent indiquer que vous ne pouvez même pas visualiser facilement les arguments d'invocation Java Java facilement dans SBT. Toute aide est appréciée.
Cela marche:
sbt '; set javaOptions += "-Dconfig.resource=../application.conf" ; runMain akka.Main com.my.main.Actor'
Si ce n'est pas une syntaxe suffisamment "conviviale", enveloppez-la dans un petit script Shell.
(Notez que cela suppose que fork
est défini sur true pour l'exécution. Si vous ne le faites pas, consultez le commentaire de 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
Les éléments suivants (très minimalistes) build.sbt
a bien fonctionné.
fork := true
envVars := Map("msg" -> "hello")
Une fois que vous l'avez lancé, définir envVars
sur 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 les 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. Cependant, les éléments suivants ont fonctionné lorsque vous essayez de transmettre les paramètres Liquibase, comme le mot de passe, à partir de nos frameworks CI.
Moche, mais fournit des valeurs par défaut et récupère éventuellement System.properties. 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")
Maintenant, remplacez simplement par -Dprop=value
comme vous le feriez avec Maven ou d'autres programmes JVM. Notez que les accessoires apparaissent avant la tâche SBT.
sbt -Dliquibase.password="shh" -Dliquibase.username="bob" liquibase:liquibase-update