Java System.getProperty vs System.getenv

1. Pengenalan

Paket java.lang diimport secara automatik ketika dalam aplikasi Java. Pakej ini mengandungi banyak kelas yang biasa digunakan dari NullPointerException hingga Object , Math , dan String .

The java.lang.System kelas adalah akhir kelas, bermakna bahawa kita tidak boleh subkelas, oleh itu semua kaedah yang statik .

Kami akan melihat perbezaan antara dua kaedah Sistem untuk membaca sifat sistem dan pemboleh ubah persekitaran.

Kaedah ini adalah getProperty dan getenv .

2. Menggunakan System.getProperty ()

Platform Java menggunakan objek Properties untuk memberikan maklumat mengenai sistem dan konfigurasi tempatan dan kami memanggilnya System Properties .

Sistem Properties merangkumi maklumat seperti pengguna semasa, versi semasa runtime Java, dan pemisah nama jalan fail.

Dalam kod di bawah, kami menggunakan System.getProperty ("log_dir") untuk membaca nilai log_dir harta . Kami juga menggunakan parameter nilai lalai jadi jika harta itu tidak ada, getProperty mengembalikan / tmp / log :

String log_dir = System.getProperty("log_dir","/tmp/log"); 

Untuk mengemas kini Properties Sistem semasa runtime, gunakan kaedah System.setProperty :

System.setProperty("log_dir", "/tmp/log");

Kita boleh menyampaikan nilai sifat atau konfigurasi kita sendiri ke aplikasi menggunakan argumen baris perintah propertiName dalam format:

java -jar jarName -DpropertyName=value

Menetapkan sifat foo dengan nilai bar di app.jar:

java -jar app -Dfoo="bar"

System.getProperty akan sentiasa mengembalikan tali .

3. Menggunakan System.getenv ()

Pemboleh ubah persekitaran adalah pasangan kunci / nilai seperti Properties. Banyak Sistem Operasi menggunakan Pemboleh ubah Persekitaran untuk membolehkan maklumat konfigurasi disalurkan ke dalam aplikasi.

Cara menetapkan pemboleh ubah persekitaran berbeza antara satu sistem operasi dengan sistem operasi yang lain. Sebagai contoh, di Windows, kami menggunakan aplikasi Utiliti Sistem dari panel kawalan sementara di Unix kami menggunakan skrip shell.

Semasa membuat proses, secara lalai ia mewarisi persekitaran klon dari proses induknya.

Coretan kod berikut menunjukkan menggunakan ungkapan lambda untuk mencetak semua Pembolehubah Alam Sekitar.

System.getenv().forEach((k, v) -> { System.out.println(k + ":" + v); }); 

getenv () mengembalikan Peta baca sahaja . Mencuba untuk menambahkan nilai ke peta melemparkan UnsupportedOperationException .

Untuk mendapatkan pemboleh ubah tunggal, panggil getenv dengan nama pemboleh ubah:

String log_dir = System.getenv("log_dir");

Sebaliknya, kita dapat membuat proses lain dari aplikasi kita dan menambahkan pemboleh ubah baru ke persekitarannya.

Untuk membuat proses baru di Java, kami menggunakan kelas ProcessBuilder yang mempunyai kaedah yang disebut lingkungan . Kaedah ini mengembalikan Peta tetapi kali ini peta tidak boleh dibaca sahaja, yang bermaksud kita dapat menambahkan elemen padanya:

ProcessBuilder pb = new ProcessBuilder(args); Map env = pb.environment(); env.put("log_dir", "/tmp/log"); Process process = pb.start();

4. Perbezaannya

Walaupun kedua-dua pada dasarnya peta yang menyediakan String nilai untuk String kunci, biar di beberapa perbezaan:

  1. Kita boleh mengemas kini Properties semasa runtime sementara Pemboleh ubah Lingkungan adalah salinan variabel Sistem Operasi yang tidak berubah.
  2. Properties hanya terdapat dalam platform Java sementara Variabel Lingkungan bersifat global di peringkat Sistem Operasi - tersedia untuk semua aplikasi yang berjalan pada mesin yang sama.
  3. Hartanah mesti ada semasa mengemas aplikasi tetapi kita boleh membuat Pembolehubah Lingkungan pada Sistem Operasi pada hampir semua titik.

5. Kesimpulan

Walaupun secara konsepnya serupa, penerapan kedua-dua Properties dan Environment Variables agak berbeza.

Pilihan antara pilihan sering menjadi persoalan skop. Dengan menggunakan Pembolehubah Persekitaran, aplikasi yang sama dapat digunakan ke beberapa mesin untuk menjalankan keadaan yang berbeza dan dapat dikonfigurasi pada tingkat Sistem Operasi atau bahkan di AWS atau Konsol Azure. Mengeluarkan keperluan untuk membina semula aplikasi untuk mengemas kini konfigurasi.

Sentiasa ingat bahawa getProperty mengikuti konvensyen kes unta dan getenv tidak.