Saya memiliki program Java yang membaca properti Sistem
System.getProperty("cassandra.ip");
dan saya memiliki file build Gradle yang saya mulai
gradle test -Pcassandra.ip=192.168.33.13
atau
gradle test -Dcassandra.ip=192.168.33.13
namun System.getProperty akan selalu mengembalikan null .
Satu-satunya cara yang saya temukan adalah menambahkannya ke file build Gradle saya melalui
test {
systemProperty "cassandra.ip", "192.168.33.13"
}
Bagaimana Saya melakukannya melalui -D
gradle -Dcassandra.ip=192.168.33.13
? Bagaimanapun, tugas pengujian membagi satu atau beberapa JVM baru. Jadi, Anda harus meneruskan properti secara eksplisit. Tidak ada yang memaksa Anda untuk melakukan hardcode nilai mereka dalam build.Jawaban:
Bendera -P untuk properti gradle, dan tanda -D untuk properti JVM. Karena pengujian mungkin bercabang dalam JVM baru, argumen -D yang diteruskan ke gradle tidak akan disebarkan ke pengujian - sepertinya itulah perilaku yang Anda lihat.
Anda dapat menggunakan systemProperty di
test
blok Anda seperti yang telah Anda lakukan tetapi mendasarkannya pada properti gradle yang masuk dengan meneruskannya dengan -P:atau sebagai alternatif, jika Anda mengirimkannya melalui -D
sumber
System.getProperties().stringPropertyNames().forEach(System.out::println);
dalam kode Java, tidak muncul)getProperty
melemparMissingPropertyException
jika properti tidak ditemukan. Gunakan jawaban Eron sebagai gantinya: stackoverflow.com/a/43112126/915441gradle.properties
akan mencegahMissingPropertyException
.Menemukan banyak masalah ini, kecuali saya tidak ingin membuat daftar semua properti yang diberikan pada baris perintah dalam skrip gradle lagi. Oleh karena itu saya mengirim semua properti sistem untuk pengujian saya
sumber
Saya punya kasus di mana saya harus meneruskan beberapa properti sistem ke dalam pengujian JVM tetapi tidak semua (tidak ingin lulus di yang tidak relevan). Berdasarkan jawaban di atas, dan dengan menggunakan
subMap
untuk memfilter yang saya butuhkan, ini berhasil untuk saya:Dalam contoh ini, hanya
PROP1
danPROP2
akan diteruskan, jika ada di JVM gradle.sumber
Berikut adalah varian yang meneruskan banyak properti proyek untuk menguji JVM sebagai properti sistem. Saya lebih suka properti proyek daripada properti sistem untuk meningkatkan fleksibilitas.
Yang mungkin diteruskan pada baris perintah:
Dan diambil dalam pengujian Anda:
sumber
System.getProperty("someprop")
menggunakan metode subMap, saya mendapatkan{someprop=foo}
alih - alihfoo
. Saya harus menggunakansystemProperty "foo", project.properties.subMap(["foo"]).get("foo")
di build.gradlesystemProperty "foo"
? yaitu saya meminta untuk melihat baris lengkap kode di mana ini digunakan? Saya mencoba semua yang disarankan dalam pertanyaan ini dan Gradle tetap tidak memberikan argumen apa pun. Berharap ini bisa diselesaikan!Jadi saya telah tersandung pada masalah itu hari ini juga, dan yang berhasil untuk saya adalah sebagai berikut:
Saya memanggil tugas pengujian saya menggunakan -Penv = dev dan saya mendapatkan nilai 'dev' di cetakan saya, atau 'prod' jika saya tidak mengirim nilai apa pun, yang merupakan perilaku yang diharapkan untuk saya.
Nilai juga dapat diakses di sisi java, menggunakan System.getProperty ("env") .
Kesimpulan saya tentang masalah ini adalah bahwa nilai input (parameter) sebenarnya disimpan di bawah Sistem , membuatnya dapat diakses melalui System.properties ['env'] atau System.getProperty ("env") , sedangkan output (properti sistem) disimpan di sebuah systemProperties array, sehingga dapat dibaca melalui systemProperties [ 'env'] .
sumber