Mam program Java, który odczytuje właściwość systemu
System.getProperty("cassandra.ip");
i mam plik kompilacji Gradle, od którego zaczynam
gradle test -Pcassandra.ip=192.168.33.13
lub
gradle test -Dcassandra.ip=192.168.33.13
jednak System.getProperty zawsze zwróci wartość null .
Jedynym sposobem, jaki znalazłem, było dodanie tego w moim pliku kompilacji Gradle za pośrednictwem
test {
systemProperty "cassandra.ip", "192.168.33.13"
}
Jak to zrobić za pomocą -D
gradle -Dcassandra.ip=192.168.33.13
? W każdym razie zadanie testowe obejmuje jedną lub kilka nowych maszyn JVM. Musisz więc jawnie przekazać właściwości. Nikt jednak nie zmusza cię do zakodowania ich wartości w kompilacji.Odpowiedzi:
Opcja -P dotyczy właściwości gradle, a opcja -D dotyczy właściwości maszyny JVM. Ponieważ test może być rozwidlony w nowej maszynie JVM, argument -D przekazany do gradle nie zostanie przekazany do testu - wygląda na to, że widzisz takie zachowanie.
Możesz użyć właściwości systemowej w swoim
test
bloku, tak jak to zrobiłeś, ale oprzeć ją na właściwości przychodzącej gradle, przekazując ją z nią -P:lub alternatywnie, jeśli przekazujesz go przez -D
źródło
System.getProperties().stringPropertyNames().forEach(System.out::println);
w kodzie Java, nie pojawia się)getProperty
wyrzuca,MissingPropertyException
jeśli właściwość nie zostanie znaleziona. Zamiast tego użyj odpowiedzi Eron: stackoverflow.com/a/43112126/915441gradle.properties
zapobiegnie wystąpieniuMissingPropertyException
.Przeszedłem przez ten bardzo duży problem, z wyjątkiem tego, że nie chcę ponownie wyświetlać wszystkich właściwości podanych w wierszu poleceń w skrypcie gradle. Dlatego wysyłam wszystkie właściwości systemu do mojego testu
źródło
Miałem przypadek, w którym musiałem przekazać wiele właściwości systemu do testowej maszyny JVM, ale nie wszystkie (nie chciałem przekazywać nieistotnych). W oparciu o powyższe odpowiedzi i używając
subMap
do filtrowania tych, których potrzebowałem, zadziałało to dla mnie:W tym przykładzie tylko
PROP1
iPROP2
zostaną przekazane, jeśli istnieją w JVM gradle.źródło
Oto wariant, który przekazuje wiele właściwości projektu do testowej maszyny JVM jako właściwości systemu. Preferuję właściwości projektu od właściwości systemu, aby zwiększyć elastyczność.
Które można przekazać w wierszu poleceń:
I odzyskane w twoim teście:
źródło
System.getProperty("someprop")
przy użyciu tej metody subMap otrzymałem{someprop=foo}
zamiastfoo
. Musiałem użyćsystemProperty "foo", project.properties.subMap(["foo"]).get("foo")
w build.gradlesystemProperty "foo"
? tj. proszę o wyświetlenie pełnej linii kodu, w którym to zostało użyte? Próbuję wszystkiego, co sugeruje to pytanie, a Gradle nadal nie przekazuje żadnych argumentów. Mam nadzieję, że to rozwiąże!Więc dzisiaj również natknąłem się na ten problem, a to, co zadziałało, było następujące:
Wywołuję swoje zadanie testowe za pomocą -Penv = dev i otrzymuję wartość „dev” na wydruku lub „prod”, jeśli nie wysyłam żadnej wartości, co jest dla mnie oczekiwanym zachowaniem.
Wartość jest również dostępna po stronie Java, używając System.getProperty ("env") .
Mój wniosek w tej sprawie jest taki, że wartość wejściowa (parametr) jest faktycznie przechowywana w Systemie , dzięki czemu jest dostępna za pośrednictwem System.properties ['env'] lub System.getProperty ("env") , podczas gdy dane wyjściowe (właściwość systemowa) są przechowywane w systemProperties macierz, co czytelny przez systemProperties [ 'env'] .
źródło