Eu tenho um programa Java que lê uma propriedade do sistema
System.getProperty("cassandra.ip");
e eu tenho um arquivo de compilação do Gradle com o qual começo
gradle test -Pcassandra.ip=192.168.33.13
ou
gradle test -Dcassandra.ip=192.168.33.13
no entanto, System.getProperty sempre retornará nulo .
A única maneira que encontrei foi adicionar isso ao meu arquivo de compilação do Gradle via
test {
systemProperty "cassandra.ip", "192.168.33.13"
}
Como faço isso via -D
gradle -Dcassandra.ip=192.168.33.13
? De qualquer forma, a tarefa de teste bifurca uma ou várias JVMs novas. Portanto, você terá que passar as propriedades explicitamente. Ninguém o força a codificar seu valor na construção, no entanto.Respostas:
O sinalizador -P é para propriedades gradle e o sinalizador -D é para propriedades JVM. Como o teste pode ser bifurcado em uma nova JVM, o argumento -D passado para gradle não será propagado para o teste - parece que esse é o comportamento que você está vendo.
Você pode usar a propriedade systemProperty em seu
test
bloco como fez, mas basea-la na propriedade gradle de entrada, passando-a com -P:ou alternativamente, se você estiver passando via -D
fonte
System.getProperties().stringPropertyNames().forEach(System.out::println);
o código Java, não parece)getProperty
lançaMissingPropertyException
se a propriedade não for encontrada. Em vez disso, use a resposta de Eron: stackoverflow.com/a/43112126/915441gradle.properties
evitará oMissingPropertyException
.Deparei com esse mesmo problema, exceto que não quero listar todas as propriedades fornecidas na linha de comando no script do Gradle novamente. Portanto, envio todas as propriedades do sistema para o meu teste
fonte
Tive um caso em que precisei passar várias propriedades do sistema para a JVM de teste, mas não todas (não queria passar as irrelevantes). Com base nas respostas acima, e usando
subMap
para filtrar as que eu precisava, isso funcionou para mim:Neste exemplo, apenas
PROP1
ePROP2
será transmitido, se existirem na JVM do gradle.fonte
Aqui está uma variante que passa várias propriedades do projeto para a JVM de teste como propriedades do sistema. Eu prefiro propriedades de projeto em vez de propriedades de sistema para aumentar a flexibilidade.
Que pode ser passado na linha de comando:
E recuperado em seu teste:
fonte
System.getProperty("someprop")
método subMap, obtive em{someprop=foo}
vez defoo
. Tive que usarsystemProperty "foo", project.properties.subMap(["foo"]).get("foo")
em build.gradlesystemProperty "foo"
? ou seja, estou pedindo para ver a linha completa de código onde isso foi usado? Estou tentando tudo sugerido nesta pergunta e ainda assim Gradle não está passando nenhum argumento. Esperando que isso resolva!Também me deparei com esse problema hoje, e o que funcionou para mim foi o seguinte:
Estou chamando minha tarefa de teste usando -Penv = dev e recebo meu valor 'dev' na minha impressão, ou 'prod' se não enviar nenhum valor, que é o comportamento esperado para mim.
O valor também é acessível no lado java, usando System.getProperty ("env") .
Minha conclusão sobre o assunto é que o valor de entrada (parâmetro) é realmente armazenado em Sistema , tornando-o acessível por meio de System.properties ['env'] ou System.getProperty ("env") , enquanto a saída (propriedade do sistema) é armazenada em uma matriz systemProperties , tornando-a legível por meio de systemProperties ['env'] .
fonte