J'ai un programme Java qui lit une propriété système
System.getProperty("cassandra.ip");
et j'ai un fichier de construction Gradle avec lequel je commence
gradle test -Pcassandra.ip=192.168.33.13
ou
gradle test -Dcassandra.ip=192.168.33.13
cependant System.getProperty renverra toujours null .
Le seul moyen que j'ai trouvé était d'ajouter cela dans mon fichier de construction Gradle via
test {
systemProperty "cassandra.ip", "192.168.33.13"
}
Comment faire via -D
gradle -Dcassandra.ip=192.168.33.13
? Quoi qu'il en soit, la tâche de test fourche une ou plusieurs nouvelles JVM. Vous devrez donc transmettre les propriétés explicitement. Personne ne vous oblige à coder en dur leur valeur dans la construction, cependant.Réponses:
L'indicateur -P est pour les propriétés gradle et l'indicateur -D est pour les propriétés JVM. Comme le test peut être forké dans une nouvelle JVM, l'argument -D passé à gradle ne sera pas propagé au test - il semble que c'est le comportement que vous voyez.
Vous pouvez utiliser la propriété systemProperty dans votre
test
bloc comme vous l'avez fait, mais basez-la sur la propriété gradle entrante en la passant avec -P:ou bien, si vous le transmettez via -D
la source
System.getProperties().stringPropertyNames().forEach(System.out::println);
le code Java, cela n'apparaît pas)getProperty
lanceMissingPropertyException
si la propriété n'est pas trouvée. Utilisez la réponse d'Eron à la place: stackoverflow.com/a/43112126/915441gradle.properties
empêchera leMissingPropertyException
.Je suis tombé sur ce problème, sauf que je ne veux pas lister à nouveau toutes les propriétés données sur la ligne de commande dans le script gradle. Par conséquent, j'envoie toutes les propriétés du système à mon test
la source
J'ai eu un cas où je devais passer plusieurs propriétés système dans la JVM de test, mais pas toutes ( je ne voulais pas passer de propriétés non pertinentes). Sur la base des réponses ci-dessus et en utilisant
subMap
pour filtrer celles dont j'avais besoin, cela a fonctionné pour moi:Dans cet exemple, uniquement
PROP1
etPROP2
seront transmis, s'ils existent dans la JVM de gradle.la source
Voici une variante qui transmet de nombreuses propriétés de projet à la JVM de test en tant que propriétés système. Je préfère les propriétés du projet aux propriétés du système pour augmenter la flexibilité.
Qui peut être passé sur la ligne de commande:
Et récupéré dans votre test:
la source
System.getProperty("someprop")
cette méthode subMap, j'ai obtenu à la{someprop=foo}
place defoo
. J'ai dû utilisersystemProperty "foo", project.properties.subMap(["foo"]).get("foo")
dans build.gradlesystemProperty "foo"
? c'est-à-dire que je demande à voir la ligne complète de code où cela a été utilisé? J'essaie tout ce qui est suggéré dans cette question et Gradle ne transmet toujours aucun argument. En espérant que cela résoudra!Je suis donc tombé sur ce problème aujourd'hui, et ce qui a fonctionné pour moi était le suivant:
J'appelle ma tâche de test en utilisant -Penv = dev et j'obtiens ma valeur 'dev' dans mon impression, ou 'prod' si je n'envoie aucune valeur, ce qui est le comportement attendu pour moi.
La valeur est également accessible côté Java, en utilisant System.getProperty ("env") .
Ma conclusion à ce sujet est que la valeur d'entrée (paramètre) est en fait stockée sous System , ce qui la rend accessible via System.properties ['env'] ou System.getProperty ("env") , alors que la sortie (propriété système) est stockée dans un tableau systemProperties , le rendant lisible via systemProperties ['env'] .
la source