Java中的System.getenv()和System.getProperty()使用詳解
System.getenv()和System.getProperty()是Java種常用的兩種讀取環(huán)境配置信息的方法,它們都是java.lang.System類的方法,用途有相似之處,但我們?cè)趯?shí)際使用中,需要更加注意二者的區(qū)別。
1. System.getenv()
System.getenv()讀取的是當(dāng)前系統(tǒng)環(huán)境的環(huán)境變量。
要深入理解環(huán)境變量的本質(zhì),需要對(duì)系統(tǒng)父子進(jìn)程關(guān)系有更加清晰的認(rèn)識(shí)。
一般來說,子進(jìn)程在創(chuàng)建時(shí),會(huì)將父進(jìn)程當(dāng)時(shí)的環(huán)境變量復(fù)制一份,而父進(jìn)程中之后發(fā)生的環(huán)境變量的變動(dòng),不會(huì)影響子進(jìn)程中對(duì)應(yīng)的環(huán)境變量。
當(dāng)不傳入?yún)?shù)時(shí),System.getenv()的返回值為一個(gè)只讀的Map,其中包括當(dāng)前環(huán)境下所有環(huán)境變量。
下面的例子中:
我們將打印出這條語句執(zhí)行時(shí)環(huán)境中所有的環(huán)境變量和它們對(duì)應(yīng)的值,在 windows 中是 用戶環(huán)境變量和系統(tǒng)環(huán)境變量的值,
System.getenv().forEach((key, value) -> { System.out.println(key + ":" + value); });
注意:通過 System.getenv()
獲取的 Map 是不支持修改的,為了有更深入的理解,我們熟悉下這塊的代碼
public static java.util.Map<String,String> getenv() { // ...... return ProcessEnvironment.getenv(); }
ProcessEnvironment.getenv()
該方法的核心邏輯如下,從以下代碼中可以看出,返回的 map 是通過Collections.unmodifiableMap()
處理的,因此,返回的map 是不能被修改的。
final class ProcessEnvironment extends HashMap<String,String>{ private static final Map<String,String> theUnmodifiableEnvironment; static { theEnvironment = new ProcessEnvironment(); theUnmodifiableEnvironment = Collections.unmodifiableMap(theEnvironment); } // Only for use by System.getenv() static Map<String,String> getenv() { return theUnmodifiableEnvironment; } }
一般我們?cè)诔绦蛑惺褂脮r(shí),一般不會(huì)獲取全部的系統(tǒng)環(huán)境變量,因而可以通過 System.getEnv(key)
獲取對(duì)應(yīng)環(huán)境變量的值。
public static String getenv(String name) { // ..... return ProcessEnvironment.getenv(name); }
2. System.getProperty()
通上,通過 System.getProperty(key)
獲取單個(gè)變量值,通過System.getPropertys()
獲取所有 JVM 環(huán)境變量值。
如下:
System.getProperties().forEach((k,v) -> { System.out.println(k + "=" + v); });
這里列出一些常見的
// classpath sun.boot.class.path=C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;.... java.library.path=C:\Program Files\Java\jdk1.8.0_131\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32; file.separator=\ sun.jnu.encoding=GBK java.version=1.8.0_131 java.vm.info=mixed mode
當(dāng)我們通過 啟動(dòng)JVM時(shí),可以通過 -D 設(shè)置JVM 環(huán)境變量值,在我們的程序中我們也可以通過,System.setProperty(key,value)
設(shè)置JVM 環(huán)境變量,該值在整個(gè)JVM 間是共享的。
使用場(chǎng)景
最近線上大數(shù)據(jù) Hadoop 集群開啟了Kerberos,為了讓業(yè)務(wù)盡量不改動(dòng)代碼的原則。
通過 System.getenv()
和 System.getenv()
實(shí)現(xiàn)了業(yè)務(wù)代碼零改動(dòng)下,使用開啟Kerberos后的集群。
總結(jié)
通過 System.getenv()
和 getProperty()
可以簡(jiǎn)化我們的有些配置,相比于 xml 等配置文件。
這種方式更輕量,如果我們的程序中沒有配置文件,但想使某一兩項(xiàng)功能實(shí)現(xiàn)可配置,通過System.getenv()
和 getProperty()
可以非常容易的實(shí)現(xiàn)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
idea2020.3配置maven環(huán)境并配置Tomcat的詳細(xì)教程
這篇文章主要介紹了idea2020.3配置maven環(huán)境并配置Tomcat的詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03在SpringBoot中整合使用Netty框架的詳細(xì)教程
這篇文章主要介紹了在SpringBoot中整合使用Netty框架的教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06SpringBoot+RabbitMQ?實(shí)現(xiàn)死信隊(duì)列的示例
本文主要介紹了SpringBoot+RabbitMQ?實(shí)現(xiàn)死信隊(duì)列的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06Spring?Security中如何獲取AuthenticationManager對(duì)象
有時(shí)需要使用AuthenticationManager(以下簡(jiǎn)稱Manager)對(duì)象,可是這個(gè)對(duì)象不是Bean,沒有直接保存在Spring的Bean庫(kù)中,那么如何獲取Spring Security中的這個(gè)對(duì)象呢,需要的朋友可以參考下2022-11-11MyBatis-Plus+達(dá)夢(mèng)數(shù)據(jù)庫(kù)實(shí)現(xiàn)高效數(shù)據(jù)持久化的示例
這篇文章主要介紹了MyBatis-Plus和達(dá)夢(mèng)數(shù)據(jù)庫(kù)實(shí)現(xiàn)高效數(shù)據(jù)持久化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08SpringBoot中的server.context-path的實(shí)現(xiàn)
本文主要介紹了SpringBoot中的server.context-path的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08Maven構(gòu)建Hadoop項(xiàng)目的實(shí)踐步驟
本文主要介紹了Maven構(gòu)建Hadoop項(xiàng)目的實(shí)踐步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06