web-dev-qa-db-fra.com

Comment définir les propriétés système de runMain en 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?

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.

40
Chad Retz

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

42
Seth Tisue

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
17
Jacek Laskowski

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.

Dans votre build.sbt

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

Depuis la ligne de commande

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

6
Joseph Lust