Java System.getProperty vs System.getenv

1. Perkenalan

Paket java.lang secara otomatis diimpor saat berada dalam aplikasi Java. Paket ini berisi banyak kelas yang umum digunakan dari NullPointerException hingga Object , Math , dan String .

Kelas java.lang.System adalah kelas terakhir , artinya kita tidak dapat membuat subkelasnya, oleh karena itu semua metode bersifat statis .

Kita akan melihat perbedaan antara dua metode Sistem untuk membaca properti sistem dan variabel lingkungan.

Metode ini adalah getProperty dan getenv .

2. Menggunakan System.getProperty ()

Platform Java menggunakan objek Properties untuk memberikan informasi tentang sistem dan konfigurasi lokal dan kami menyebutnya System Properties .

Properti Sistem mencakup informasi seperti pengguna saat ini, versi Java runtime saat ini, dan pemisah nama jalur file.

Pada kode di bawah ini, kami menggunakan System.getProperty ("log_dir") untuk membaca nilai properti log_dir . Kami juga menggunakan parameter nilai default jadi jika properti tidak ada, getProperty mengembalikan / tmp / log :

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

Untuk memperbarui Properti Sistem saat runtime, gunakan metode metode System.setProperty :

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

Kita dapat mengirimkan properti atau nilai konfigurasi kita sendiri ke aplikasi menggunakan argumen baris perintah propertyName dalam format:

java -jar jarName -DpropertyName=value

Mengatur properti foo dengan nilai bar di app.jar:

java -jar app -Dfoo="bar"

System.getProperty akan selalu mengembalikan String .

3. Menggunakan System.getenv ()

Variabel Lingkungan adalah pasangan kunci / nilai seperti Properti. Banyak Sistem Operasi menggunakan Variabel Lingkungan untuk memungkinkan informasi konfigurasi diteruskan ke aplikasi.

Cara untuk menetapkan variabel lingkungan berbeda dari satu sistem operasi ke sistem operasi lainnya. Misalnya, di Windows, kami menggunakan aplikasi System Utility dari panel kontrol sedangkan di Unix kami menggunakan skrip shell.

Saat membuat proses, secara default ia mewarisi lingkungan klon dari proses induknya.

Cuplikan kode berikut menunjukkan penggunaan ekspresi lambda untuk mencetak semua Variabel Lingkungan.

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

getenv () mengembalikan Peta hanya-baca . Mencoba menambahkan nilai ke peta akan memunculkan UnsupportedOperationException .

Untuk mendapatkan satu variabel, panggil getenv dengan nama variabel:

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

Di sisi lain, kita dapat membuat proses lain dari aplikasi kita dan menambahkan variabel baru ke lingkungannya.

Untuk membuat proses baru di Java, kami menggunakan kelas ProcessBuilder yang memiliki metode yang disebut lingkungan . Metode ini mengembalikan Peta tetapi kali ini petanya tidak hanya-baca, artinya kita dapat menambahkan elemen ke dalamnya:

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

4. Perbedaan

Meskipun keduanya pada dasarnya peta yang menyediakan String nilai untuk String kunci, mari kita lihat di sebuah beberapa perbedaan:

  1. Kami dapat memperbarui Properti saat runtime sementara Variabel Lingkungan adalah salinan tetap dari variabel Sistem Operasi.
  2. Properti hanya terdapat dalam platform Java sementara Variabel Lingkungan bersifat global pada tingkat Sistem Operasi - tersedia untuk semua aplikasi yang berjalan pada mesin yang sama.
  3. Properti harus ada saat memaketkan aplikasi tetapi kita dapat membuat Variabel Lingkungan pada Sistem Operasi di hampir semua titik.

5. Kesimpulan

Meskipun secara konseptual serupa, penerapan Variabel Properti dan Lingkungan cukup berbeda.

Pilihan di antara opsi-opsi tersebut seringkali merupakan pertanyaan ruang lingkup. Menggunakan Variabel Lingkungan, aplikasi yang sama dapat diterapkan ke beberapa mesin untuk menjalankan instans berbeda dan dapat dikonfigurasi di tingkat Sistem Operasi atau bahkan di AWS atau Konsol Azure. Menghapus kebutuhan untuk membangun kembali aplikasi untuk memperbarui konfigurasi.

Selalu ingat bahwa getProperty mengikuti konvensi kasus-unta dan getenv tidak.