1. Въведение
Пакетът java.lang се импортира автоматично, когато е в Java приложение. Този пакет съдържа много често използвани класове от NullPointerException до Object , Math и String .
Класът java.lang.System е краен клас, което означава, че не можем да го подкласираме, следователно всички методи са статични .
Ще разгледаме разликите между два системни метода за четене на свойствата на системата и променливите на средата.
Тези методи са getProperty и getenv .
2. Използване на System.getProperty ()
Платформата Java използва обект Properties, за да предостави информация за локалната система и конфигурация и ние я наричаме System Properties .
Системните свойства включват информация като текущия потребител, текущата версия на изпълнението на Java и разделител на име на път на файл.
В кода по-долу използваме System.getProperty (“log_dir”), за да прочетем стойността на свойството log_dir . Също така използваме параметъра по подразбиране на стойността, така че ако свойството не съществува, getProperty връща на / tmp / log :
String log_dir = System.getProperty("log_dir","/tmp/log");
За да актуализирате системните свойства по време на изпълнение, използвайте метода System.setProperty метод:
System.setProperty("log_dir", "/tmp/log");
Можем да предаваме собствени стойности на свойства или конфигурации на приложението, като използваме аргумента на командния ред propertyName във формата:
java -jar jarName -DpropertyName=value
Задаване на свойството foo със стойност на bar в app.jar:
java -jar app -Dfoo="bar"
System.getProperty винаги ще връща String .
3. Използване на System.getenv ()
Променливите на околната среда са двойки ключ / стойност като Properties. Много операционни системи използват променливи на околната среда, за да позволят информацията за конфигурацията да се предава в приложения.
Начинът за задаване на променлива на околната среда се различава при различните операционни системи. Например в Windows използваме приложение на System Utility от контролния панел, докато в Unix използваме черупкови скриптове.
Когато създава процес, по подразбиране той наследява клонираща среда на своя родителски процес.
Следният кодов фрагмент показва използване на ламбда израз за отпечатване на всички променливи на околната среда.
System.getenv().forEach((k, v) -> { System.out.println(k + ":" + v); });
getenv () връща карта само за четене . Опитът да добавите стойности към картата изхвърля UnsupportedOperationException .
За да получите единична променлива, извикайте getenv с името на променливата:
String log_dir = System.getenv("log_dir");
От друга страна, можем да създадем друг процес от нашето приложение и да добавим нови променливи към неговата среда.
За да създадем нов процес в Java, използваме клас ProcessBuilder, който има метод, наречен среда . Този метод връща карта, но този път картата не е само за четене, което означава, че можем да добавим елементи към нея:
ProcessBuilder pb = new ProcessBuilder(args); Map env = pb.environment(); env.put("log_dir", "/tmp/log"); Process process = pb.start();
4. Разликите
Въпреки че и двете по същество са карти, които предоставят String стойности за String ключове, нека разгледаме няколко разлики:
- Можем да актуализираме Properties по време на изпълнение, докато променливите на околната среда са неизменяемо копие на променливите на операционната система.
- Свойствата се съдържат само в платформата Java, докато променливите на околната среда са глобални на ниво операционна система - достъпни за всички приложения, работещи на една и съща машина.
- Свойствата трябва да съществуват при опаковане на приложението, но можем да създадем променливи на околната среда в операционната система в почти всяка точка.
5. Заключение
Макар и концептуално подобни, приложението на свойствата и променливите на околната среда са доста различни.
Изборът между опциите често е въпрос на обхват. Използвайки променливи на околната среда, едно и също приложение може да бъде внедрено на множество машини за изпълнение на различни екземпляри и може да бъде конфигурирано на ниво операционна система или дори в AWS или Azure Consoles. Премахване на необходимостта от възстановяване на приложението за актуализиране на конфигурацията.
Винаги помнете, че getProperty следва конвенцията за камила, а getenv не.