システムプロパティを読み取るJavaプログラムがあります
System.getProperty("cassandra.ip");
そして、私はGradleビルドファイルを持っています
gradle test -Pcassandra.ip=192.168.33.13
または
gradle test -Dcassandra.ip=192.168.33.13
ただし、System.getPropertyは常にnullを返します。
私が見つけた唯一の方法は、それをGradleビルドファイルに追加することでした
test {
systemProperty "cassandra.ip", "192.168.33.13"
}
-D経由でそれを行う方法
-Pフラグはgradleプロパティ用で、-DフラグはJVMプロパティ用です。テストは新しいJVMで分岐される可能性があるため、gradleに渡された-D引数はテストに伝播されません。これは、あなたが見ている動作のようです。
test
ブロックでsystemPropertyを使用することはできますが、-Pで渡すことにより、着信gradleプロパティに基づいて作成できます。
test {
systemProperty "cassandra.ip", project.getProperty("cassandra.ip")
}
または、-Dで渡す場合
test {
systemProperty "cassandra.ip", System.getProperty("cassandra.ip")
}
この非常に多くの問題に出くわしましたが、Gradleスクリプトのコマンドラインで指定されたすべてのプロパティを再度表示したくないことを除いて。したがって、すべてのシステムプロパティをテストに送信します
task integrationTest(type: Test) {
useTestNG()
options {
systemProperties(System.getProperties())
}
}
複数システムプロパティをテストJVMに渡す必要があるが、all(無関係なものを渡したくない)を渡す必要がある場合がありました。上記の回答に基づいて、subMap
を使用して必要なものをフィルタリングすることで、これは私のために働いた:
task integrationTest(type: Test) {
// ... Do stuff here ...
systemProperties System.getProperties().subMap(['PROP1', 'PROP2'])
}
この例では、PROP1
とPROP2
のみが、gradleのJVMに存在する場合に渡されます。
多数のプロジェクトプロパティをシステムプロパティとしてテストJVMに渡すバリアントは次のとおりです。柔軟性を高めるために、システムプロパティよりもプロジェクトプロパティの方が好きです。
task intTest(type: Test) {
systemProperties project.properties.subMap(["foo", "bar"])
}
コマンドラインで渡すことができます:
$ gradle intTest -Pfoo=1 -Pbar=2
そして、あなたのテストで取得しました:
String foo = System.getProperty("foo");
だから今日もその問題に出くわしましたが、私にとってうまくいったのは次のとおりです:
ext.env='prod'
test {
systemProperty 'env', System.properties['env'] ?: "${env}"
println "# test environment: " + systemProperties['env']
...
}
-Penv = devを使用してテストタスクを呼び出しており、印刷で「dev」値を取得します。値を送信しない場合は「prod」を取得します。 。
値はJava側でも、System.getProperty( "env")を使用してアクセスできます。
この問題に関する私の結論は、入力値(パラメーター)は実際にはSystemの下に保存され、System.properties ['env']またはSystem.getProperty( "env")。出力(システムプロパティ)はsystemProperties配列に格納され、systemProperties ['env']で読み取り可能になります。