環(huán)境變量這個概念不陌生, 就是操作系統(tǒng)的環(huán)境變量。
系統(tǒng)變量就是java本身維護(hù)的變量。 通過 System.getProperty 的方式獲取。
對于不同的操作系統(tǒng)來說, 環(huán)境變量的處理可能會有一些不統(tǒng)一的地方, 比如說: 不區(qū)分大小寫 等等。
Java 獲取環(huán)境變量
Java 獲取環(huán)境變量的方式很簡單:
System.getEnv() 得到所有的環(huán)境變量
System.getEnv(key) 得到某個環(huán)境變量的值
Map map = System.getenv(); Iterator it = map.entrySet().iterator(); while(it.hasNext()) { Entry entry = (Entry)it.next(); System.out.print(entry.getKey()+"="); System.out.println(entry.getValue()); }
如果是windows 系統(tǒng), 打印出來的值通過從 “我的電腦” 里看到的環(huán)境變量是一樣的。
Java 獲取和設(shè)置系統(tǒng)變量
Java 獲取環(huán)境變量的方式也很簡單:
System.getProperties() 得到所有的系統(tǒng)變量
System.getProperty(key) 得到某個系統(tǒng)變量的值
Properties properties = System.getProperties(); Iterator it = properties.entrySet().iterator(); while(it.hasNext()) { Entry entry = (Entry)it.next(); System.out.print(entry.getKey()+"="); System.out.println(entry.getValue()); }
系統(tǒng)變量除了可以獲取之外, 還可以通過System.setProperty(key, value) 的方式設(shè)置自己需要的系統(tǒng)變量。
默認(rèn)情況下, java 設(shè)置了哪些系統(tǒng)變量:
-
java.version Java 運行時環(huán)境版本
-
java.vendor Java 運行時環(huán)境供應(yīng)商
-
java.vendor.url Java 供應(yīng)商的 URL
-
java.home Java 安裝目錄
-
java.vm.specification.version Java 虛擬機規(guī)范版本
-
java.vm.specification.vendor Java 虛擬機規(guī)范供應(yīng)商
-
java.vm.specification.name Java 虛擬機規(guī)范名稱
-
java.vm.version Java 虛擬機實現(xiàn)版本
-
java.vm.vendor Java 虛擬機實現(xiàn)供應(yīng)商
-
java.vm.name Java 虛擬機實現(xiàn)名稱
-
java.specification.version Java 運行時環(huán)境規(guī)范版本
-
java.specification.vendor Java 運行時環(huán)境規(guī)范供應(yīng)商
-
java.specification.name Java 運行時環(huán)境規(guī)范名稱
-
java.class.version Java 類格式版本號
-
java.class.path Java 類路徑
-
java.library.path 加載庫時搜索的路徑列表
-
java.io.tmpdir 默認(rèn)的臨時文件路徑
-
java.compiler 要使用的 JIT 編譯器的名稱
-
java.ext.dirs 一個或多個擴(kuò)展目錄的路徑
-
os.name 操作系統(tǒng)的名稱
-
os.arch 操作系統(tǒng)的架構(gòu)
-
os.version 操作系統(tǒng)的版本
-
file.separator 文件分隔符(在 UNIX 系統(tǒng)中是"/")
-
path.separator 路徑分隔符(在 UNIX 系統(tǒng)中是":")
-
line.separator 行分隔符(在 UNIX 系統(tǒng)中是"/n")
-
user.name 用戶的賬戶名稱
-
user.home 用戶的主目錄
-
user.dir 用戶的當(dāng)前工作目錄
補充
1 . 在.bat ; .cmd 或 .sh 中會通過 set 的方式設(shè)置一些變量,
比如weblogic 的 setDomainEnv.cmd
set SUN_JAVA_HOME=C:\Oracle\Middleware\jdk160_21
這里設(shè)置的是環(huán)境變量
2. 在log4j 的配置中, 有時會配置log file 的產(chǎn)生路徑。
比如 ${LOG_DIR}/logfile.log, 這里的LOG_DIR 是被系統(tǒng)屬性的變量替換的。
3. 看一下java 源碼, 通過 System.getProperties() 的方式獲取系統(tǒng)變量時, 會有一個安全的檢查
public static Properties getProperties() { SecurityManager sm = getSecurityManager(); if (sm != null) { sm.checkPropertiesAccess(); } return props; }
在 單個Java application 測試時, System 里的SecurityManager 是空的。
在Applet 運行時, 會結(jié)合 .policy 這個文件來檢查權(quán)限。
如果給一個空的SecurityManager 會發(fā)現(xiàn)就會拋出權(quán)限異常。
public static void main(String[] args) { // TODO Auto-generated method stub System.setSecurityManager(new SecurityManager()); //SecurityManager sm = System.getSecurityManager(); //System.out.println(sm); System.getSecurityManager().checkPropertiesAccess(); }
System.getEnv()和System.getProperties()的區(qū)別
從概念上講,系統(tǒng)屬性 和環(huán)境變量 都是名稱與值之間的映射。兩種機制都能用來將用戶定義的信息傳遞給 Java 進(jìn)程。環(huán)境變量產(chǎn)生更多的全局效應(yīng),因為它們不僅對Java 子進(jìn)程可見,而且對于定義它們的進(jìn)程的所有子進(jìn)程都是可見的。在不同的操作系統(tǒng)上,它們的語義有細(xì)微的差別,比如,不區(qū)分大小寫。因為這些原因,環(huán)境變量更可能有意料不到的副作用。最好在可能的地方使用系統(tǒng)屬性。環(huán)境變量應(yīng)該在需要全局效應(yīng)的時候使用,或者在外部系統(tǒng)接口要求使用環(huán)境變量時使用(比如 PATH)。
public static void main(String [] args) { Map m = System.getenv(); for ( Iterator it = m.keySet().iterator(); it.hasNext(); ) { String key = (String ) it.next(); String value = (String ) m.get(key); System.out.println(key +":" +value); } System.out.println( "--------------------------------------" ); Properties p = System.getProperties(); for ( Iterator it = p.keySet().iterator(); it.hasNext(); ) { String key = (String ) it.next(); String value = (String ) p.get(key); System.out.println(key +":" +value); } }
輸入如下:
ANT_HOME:D:/program/devel/ant PROCESSOR_ARCHITECTURE:x86 LOGONSERVER://RJ-WEIJIANJUN HOMEDRIVE:C: CATALINA_HOME:D:/program/server/Tomcat5.5 DXSDK_DIR:d:/Program Files/Microsoft DirectX SDK (August 2008)/ VS80COMNTOOLS:C:/Program Files/Microsoft Visual Studio 8/Common7/Tools/ SESSIONNAME:Console HOMEPATH:/Documents and Settings/Administrator TMP:C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp windir:C:/WINDOWS PROCESSOR_IDENTIFIER:x86 Family 6 Model 15 Stepping 13, GenuineIntel VS90COMNTOOLS:e:/Program Files/Microsoft Visual Studio 9.0/Common7/Tools/ SystemDrive:C: USERPROFILE:C:/Documents and Settings/Administrator PATHEXT:.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH CommonProgramFiles:C:/Program Files/Common Files NUMBER_OF_PROCESSORS:2 ComSpec:C:/WINDOWS/system32/cmd.exe COMPUTERNAME:RJ-WEIJIANJUN OS:Windows_NT USERNAME:Administrator CLIENTNAME:Console TEMP:C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp USERDOMAIN:RJ-WEIJIANJUN ALLUSERSPROFILE:C:/Documents and Settings/All Users lib:C:/Program Files/SQLXML 4.0/bin/ PROCESSOR_LEVEL:6 SystemRoot:C:/WINDOWS ClusterLog:C:/WINDOWS/Cluster/cluster.log APPDATA:C:/Documents and Settings/Administrator/Application Data Path:C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;C:/Program Files/Microsoft SQL Server/80/Tools/Binn/;C:/Program Files/Microsoft SQL Server/90/DTS/Binn/;C:/Program Files/Microsoft SQL Server/90/Tools/binn/;C:/Program Files/Microsoft SQL Server/90/Tools/Binn/VSShell/Common7/IDE/;C:/Program Files/Microsoft Visual Studio 8/Common7/IDE/PrivateAssemblies/;D:/program/devel/flex_sdk2/bin;D:/program/devel/ant/bin;C:/Program Files/Java/jdk1.6.0_07/bin;%JONAS_ROOT%/bin/nt;d:/program/devel/ant/bin JAVA_HOME:C:/Program Files/Java/jdk1.6.0_07 FP_NO_HOST_CHECK:NO PROCESSOR_REVISION:0f0d ProgramFiles:C:/Program Files
-------------------------------------- java.runtime.name:Java(TM) 2 Runtime Environment, Standard Edition sun.boot.library.path:D:/Program Files/MyEclipse 6.5/jre/bin java.vm.version:1.5.0_11-b03 java.vm.vendor:Sun Microsystems Inc. java.vendor.url:http://java.sun.com/ path.separator:; java.vm.name:Java HotSpot(TM) Client VM file.encoding.pkg:sun.io sun.java.launcher:SUN_STANDARD user.country:CN sun.os.patch.level:Service Pack 2 java.vm.specification.name:Java Virtual Machine Specification user.dir:D:/dev/eclipse/mye65/workspace/jmx java.runtime.version:1.5.0_11-b03 java.awt.graphicsenv:sun.awt.Win32GraphicsEnvironment java.endorsed.dirs:D:/Program Files/MyEclipse 6.5/jre/lib/endorsed os.arch:x86 java.io.tmpdir:C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ line.separator: java.vm.specification.vendor:Sun Microsystems Inc. user.variant: os.name:Windows 2003 sun.jnu.encoding:GBK java.library.path:D:/Program Files/MyEclipse 6.5/jre/bin;.;C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;C:/Program Files/Microsoft SQL Server/80/Tools/Binn/;C:/Program Files/Microsoft SQL Server/90/DTS/Binn/;C:/Program Files/Microsoft SQL Server/90/Tools/binn/;C:/Program Files/Microsoft SQL Server/90/Tools/Binn/VSShell/Common7/IDE/;C:/Program Files/Microsoft Visual Studio 8/Common7/IDE/PrivateAssemblies/;D:/program/devel/flex_sdk2/bin;D:/program/devel/ant/bin;C:/Program Files/Java/jdk1.6.0_07/bin;%JONAS_ROOT%/bin/nt;d:/program/devel/ant/bin java.specification.name:Java Platform API Specification java.class.version:49.0 sun.management.compiler:HotSpot Client Compiler os.version:5.2 user.home:C:/Documents and Settings/Administrator user.timezone:Asia/Shanghai java.awt.printerjob:sun.awt.windows.WPrinterJob file.encoding:GBK java.specification.version:1.5 java.class.path:D:/dev/eclipse/mye65/workspace/jmx/bin;D:/program/lib/jmx/jmxtools.jar;D:/program/lib/log/commons-logging-1.1.1.jar;D:/program/lib/log/log4j-1.2.15.jar;D:/program/lib/registry/registry.jar user.name:Administrator java.vm.specification.version:1.0 java.home:D:/Program Files/MyEclipse 6.5/jre sun.arch.data.model:32 user.language:zh java.specification.vendor:Sun Microsystems Inc. awt.toolkit:sun.awt.windows.WToolkit java.vm.info:mixed mode java.version:1.5.0_11 java.ext.dirs:D:/Program Files/MyEclipse 6.5/jre/lib/ext sun.boot.class.path:D:/Program Files/MyEclipse 6.5/jre/lib/rt.jar;D:/Program Files/MyEclipse 6.5/jre/lib/i18n.jar;D:/Program Files/MyEclipse 6.5/jre/lib/sunrsasign.jar;D:/Program Files/MyEclipse 6.5/jre/lib/jsse.jar;D:/Program Files/MyEclipse 6.5/jre/lib/jce.jar;D:/Program Files/MyEclipse 6.5/jre/lib/charsets.jar;D:/Program Files/MyEclipse 6.5/jre/classes java.vendor:Sun Microsystems Inc. file.separator:/ java.vendor.url.bug:http://java.sun.com/cgi-bin/bugreport.cgi sun.io.unicode.encoding:UnicodeLittle sun.cpu.endian:little sun.desktop:windows sun.cpu.isalist:pentium_pro+mmx pentium_pro pentium+mmx pentium i486 i386 i86