Ich habe ein Java-Programm, das eine Systemeigenschaft liest
System.getProperty("cassandra.ip");
und ich habe eine Gradle-Build-Datei, mit der ich beginne
gradle test -Pcassandra.ip=192.168.33.13
oder
gradle test -Dcassandra.ip=192.168.33.13
jedoch System.getProperty wird immer wieder zurückkehren null .
Der einzige Weg, den ich gefunden habe, war, das in meine Gradle-Build-Datei über hinzuzufügen
test {
systemProperty "cassandra.ip", "192.168.33.13"
}
Wie mache ich das über -D
gradle -Dcassandra.ip=192.168.33.13
? Wie auch immer, die Testaufgabe gibt eine oder mehrere neue JVMs heraus. Sie müssen also Eigenschaften explizit übergeben. Niemand zwingt Sie jedoch dazu, ihren Wert im Build fest zu codieren.Antworten:
Das -P-Flag steht für Gradle-Eigenschaften und das -D-Flag für JVM-Eigenschaften. Da der Test möglicherweise in einer neuen JVM gegabelt wird, wird das an gradle übergebene -D-Argument nicht an den Test weitergegeben. Es scheint, dass dies das Verhalten ist, das Sie sehen.
Sie können die systemProperty in Ihrem
test
Block wie bisher verwenden, sie jedoch auf der Eigenschaft eingehender Gradle basieren, indem Sie sie mit -P übergeben:oder alternativ, wenn Sie es über -D übergeben
quelle
System.getProperties().stringPropertyNames().forEach(System.out::println);
im Java-Code, es erscheint nicht)getProperty
ausgelöst,MissingPropertyException
wenn keine Eigenschaft gefunden wird. Verwenden Sie stattdessen Eronsgradle.properties
wird das verhindertMissingPropertyException
.Ist auf dieses Problem gestoßen, außer dass ich nicht alle Eigenschaften, die in der Befehlszeile angegeben sind, erneut im Gradle-Skript auflisten möchte. Deshalb sende ich alle Systemeigenschaften an meinen Test
quelle
Ich hatte einen Fall, in dem ich mehrere Systemeigenschaften an die Test-JVM übergeben musste, aber nicht alle (wollte keine irrelevanten übergeben). Basierend auf den obigen Antworten und durch
subMap
Filtern der benötigten Antworten funktionierte dies für mich:In diesem Beispiel nur
PROP1
undPROP2
wird übergeben, wenn sie in der JVM von gradle vorhanden sind.quelle
Hier ist eine Variante, die zahlreiche Projekteigenschaften als Systemeigenschaften an die Test-JVM übergibt. Ich bevorzuge Projekteigenschaften gegenüber Systemeigenschaften, um die Flexibilität zu erhöhen.
Was über die Kommandozeile übergeben werden kann:
Und in Ihrem Test abgerufen:
quelle
System.getProperty("someprop")
mit dieser SubMap-Methode habe ich{someprop=foo}
stattfoo
. Ich musstesystemProperty "foo", project.properties.subMap(["foo"]).get("foo")
in build.gradlesystemProperty "foo"
? dh ich frage nach der vollständigen Codezeile, in der dies verwendet wurde? Ich versuche alles, was in dieser Frage vorgeschlagen wird, und dennoch gibt Gradle keine Argumente weiter. Ich hoffe, das könnte sich lösen!Daher bin ich auch heute über dieses Problem gestolpert, und was für mich funktioniert hat, war Folgendes:
Ich rufe meine Testaufgabe mit -Penv = dev auf und erhalte meinen 'dev'-Wert in meinem Druck oder' prod ', wenn ich keinen Wert sende, was für mich das erwartete Verhalten ist.
Auf den Wert kann auch auf der Java-Seite mit System.getProperty ("env") zugegriffen werden .
Meine Schlussfolgerung zu diesem Thema ist, dass der Eingabewert (Parameter) tatsächlich unter System gespeichert wird , sodass er entweder über System.properties ['env'] oder System.getProperty ("env") zugänglich ist , während die Ausgabe (Systemeigenschaft) in gespeichert wird ein systemProperties- Array, das über systemProperties ['env'] lesbar ist .
quelle