Tengo un programa Java que lee una propiedad del sistema
System.getProperty("cassandra.ip");
y tengo un archivo de compilación de Gradle con el que comienzo
gradle test -Pcassandra.ip=192.168.33.13
o
gradle test -Dcassandra.ip=192.168.33.13
sin embargo, System.getProperty siempre devolverá nulo .
La única forma que encontré fue agregar eso en mi archivo de compilación de Gradle a través de
test {
systemProperty "cassandra.ip", "192.168.33.13"
}
¿Cómo lo hago a través de -D?
gradle -Dcassandra.ip=192.168.33.13
? De todos modos, la tarea de prueba bifurca una o varias JVM nuevas. Por lo tanto, tendrá que pasar propiedades explícitamente. Sin embargo, nadie te obliga a codificar su valor en la compilación.Respuestas:
El indicador -P es para las propiedades de Gradle y el indicador -D es para las propiedades de JVM. Debido a que la prueba puede estar bifurcada en una nueva JVM, el argumento -D pasado a gradle no se propagará a la prueba; parece que ese es el comportamiento que está viendo.
Puede usar systemProperty en su
test
bloque como lo ha hecho, pero basarlo en la propiedad gradle entrante pasándola con ella -P:o alternativamente, si lo está pasando a través de -D
fuente
System.getProperties().stringPropertyNames().forEach(System.out::println);
el código de Java, no aparece)getProperty
lanzaMissingPropertyException
si no se encuentra la propiedad. Use la respuesta de Eron en su lugar: stackoverflow.com/a/43112126/915441gradle.properties
evitará elMissingPropertyException
.Encontré este gran problema, excepto que no quiero volver a enumerar todas las propiedades dadas en la línea de comandos en el script de Gradle. Por lo tanto, envío todas las propiedades del sistema a mi prueba
fuente
Tuve un caso en el que necesitaba pasar varias propiedades del sistema a la JVM de prueba, pero no todas (no quería pasar las irrelevantes). Según las respuestas anteriores, y al usar
subMap
para filtrar las que necesitaba, esto funcionó para mí:En este ejemplo, sólo
PROP1
yPROP2
será aprobada en, si es que existen en la JVM de Gradle.fuente
Aquí hay una variante que pasa numerosas propiedades del proyecto a la JVM de prueba como propiedades del sistema. Prefiero las propiedades del proyecto a las propiedades del sistema para aumentar la flexibilidad.
Que se puede pasar en la línea de comandos:
Y recuperado en tu prueba:
fuente
System.getProperty("someprop")
usando ese método subMap, obtuve en{someprop=foo}
lugar defoo
. Tuve que usarsystemProperty "foo", project.properties.subMap(["foo"]).get("foo")
en build.gradlesystemProperty "foo"
? es decir, estoy pidiendo ver la línea completa de código donde se usó esto. Estoy intentando todo lo sugerido en esta pregunta y aún Gradle no pasa ningún argumento. ¡Esperando que esto se resuelva!Así que hoy también me encontré con ese problema, y lo que funcionó para mí fue lo siguiente:
Estoy llamando a mi tarea de prueba usando -Penv = dev y obtengo mi valor 'dev' en mi impresión, o 'prod' si no envío ningún valor, que es el comportamiento esperado para mí.
También se puede acceder al valor en el lado de Java, utilizando System.getProperty ("env") .
Mi conclusión al respecto es que el valor de entrada (parámetro) se almacena en realidad en System , lo que lo hace accesible a través de System.properties ['env'] o System.getProperty ("env") , mientras que la salida (propiedad del sistema) se almacena en una matriz systemProperties , haciéndola legible a través de systemProperties ['env'] .
fuente