環境變數這個概念不陌生, 就是作業系統的環境變數。
系統變數就是java本身維護的變數。 通過 System.getProperty 的方式擷取。
對於不同的作業系統來說, 環境變數的處理可能會有一些不統一的地方, 比如說: 不區分大小寫 等等。
Java 擷取環境變數
Java 擷取環境變數的方式很簡單:
System.getEnv() 得到所有的環境變數
System.getEnv(key) 得到某個環境變數的值
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 系統, 列印出來的值通過從 “我的電腦” 裡看到的環境變數是一樣的。
Java 擷取和設定系統變數
Java 擷取環境變數的方式也很簡單:
System.getProperties() 得到所有的系統變數
System.getProperty(key) 得到某個系統變數的值
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()); }
系統變數除了可以擷取之外, 還可以通過System.setProperty(key, value) 的方式設定自己需要的系統變數。
預設情況下, java 設定了哪些系統變數:
- java.version Java 運行時環境版本
- java.vendor Java 運行時環境供應商
- java.vendor.url Java 供應商的 URL
- java.home Java 安裝目錄
- java.vm.specification.version JAVA 虛擬機器規範版本
- java.vm.specification.vendor JAVA 虛擬機器規範供應商
- java.vm.specification.name JAVA 虛擬機器正式名稱
- java.vm.version JAVA 虛擬機器實現版本
- java.vm.vendor JAVA 虛擬機器實現供應商
- java.vm.name JAVA 虛擬機器實現名稱
- java.specification.version Java 運行時環境規範版本
- java.specification.vendor Java 運行時環境規範供應商
- java.specification.name Java 運行時環境正式名稱
- java.class.version Java 類格式版本號碼
- java.class.path Java 類路徑
- java.library.path 載入庫時搜尋的路徑列表
- java.io.tmpdir 預設的臨時檔案路徑
- java.compiler 要使用的 JIT 編譯器的名稱
- java.ext.dirs 一個或多個擴充目錄的路徑
- os.name 作業系統的名稱
- os.arch 作業系統的架構
- os.version 作業系統的版本
- file.separator 檔案分隔字元(在 UNIX 系統中是"/")
- path.separator 路徑分隔字元(在 UNIX 系統中是":")
- line.separator 行分隔字元(在 UNIX 系統中是"/n")
- user.name 使用者的賬戶名稱
- user.home 使用者的主目錄
- user.dir 使用者的當前工作目錄
補充
1 . 在.bat ; .cmd 或 .sh 中會通過 set 的方式設定一些變數,
比如weblogic 的 setDomainEnv.cmd
set SUN_JAVA_HOME=C:\Oracle\Middleware\jdk160_21
這裡設定的是環境變數
2. 在log4j 的配置中, 有時會配置log file 的產生路徑。
比如 ${LOG_DIR}/logfile.log, 這裡的LOG_DIR 是被系統屬性的變數替換的。
3. 看一下java 源碼, 通過 System.getProperties() 的方式擷取系統變數時, 會有一個安全的檢查
public static Properties getProperties() { SecurityManager sm = getSecurityManager(); if (sm != null) { sm.checkPropertiesAccess(); } return props; }
在 單個Java application 測試時, System 裡的SecurityManager 是空的。
在Applet 運行時, 會結合 .policy 這個檔案來檢查許可權。
如果給一個空的SecurityManager 會發現就會拋出許可權異常。
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()的區別
從概念上講,系統屬性 和環境變數 都是名稱與值之間的映射。兩種機制都能用來將使用者定義的資訊傳遞給 Java 進程。環境變數產生更多的全域效應,因為它們不僅對Java 子進程可見,而且對於定義它們的進程的所有子進程都是可見的。在不同的作業系統上,它們的語義有細微的差別,比如,不區分大小寫。因為這些原因,環境變數更可能有意料不到的副作用。最好在可能的地方使用系統屬性。環境變數應該在需要全域效應的時候使用,或者在外部系統介面要求使用環境變數時使用(比如 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/antPROCESSOR_ARCHITECTURE:x86LOGONSERVER://RJ-WEIJIANJUNHOMEDRIVE:C:CATALINA_HOME:D:/program/server/Tomcat5.5DXSDK_DIR:d:/Program Files/Microsoft DirectX SDK (August 2008)/VS80COMNTOOLS:C:/Program Files/Microsoft Visual Studio 8/Common7/Tools/SESSIONNAME:ConsoleHOMEPATH:/Documents and Settings/AdministratorTMP:C:/DOCUME~1/ADMINI~1/LOCALS~1/Tempwindir:C:/WINDOWSPROCESSOR_IDENTIFIER:x86 Family 6 Model 15 Stepping 13, GenuineIntelVS90COMNTOOLS:e:/Program Files/Microsoft Visual Studio 9.0/Common7/Tools/SystemDrive:C:USERPROFILE:C:/Documents and Settings/AdministratorPATHEXT:.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSHCommonProgramFiles:C:/Program Files/Common FilesNUMBER_OF_PROCESSORS:2ComSpec:C:/WINDOWS/system32/cmd.exeCOMPUTERNAME:RJ-WEIJIANJUNOS:Windows_NTUSERNAME:AdministratorCLIENTNAME:ConsoleTEMP:C:/DOCUME~1/ADMINI~1/LOCALS~1/TempUSERDOMAIN:RJ-WEIJIANJUNALLUSERSPROFILE:C:/Documents and Settings/All Userslib:C:/Program Files/SQLXML 4.0/bin/PROCESSOR_LEVEL:6SystemRoot:C:/WINDOWSClusterLog:C:/WINDOWS/Cluster/cluster.logAPPDATA:C:/Documents and Settings/Administrator/Application DataPath: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/binJAVA_HOME:C:/Program Files/Java/jdk1.6.0_07FP_NO_HOST_CHECK:NOPROCESSOR_REVISION:0f0dProgramFiles:C:/Program Files
以下是property的輸出:
--------------------------------------java.runtime.name:Java(TM) 2 Runtime Environment, Standard Editionsun.boot.library.path:D:/Program Files/MyEclipse 6.5/jre/binjava.vm.version:1.5.0_11-b03java.vm.vendor:Sun Microsystems Inc.java.vendor.url:http://java.sun.com/path.separator:;java.vm.name:Java HotSpot(TM) Client VMfile.encoding.pkg:sun.iosun.java.launcher:SUN_STANDARDuser.country:CNsun.os.patch.level:Service Pack 2java.vm.specification.name:Java Virtual Machine Specificationuser.dir:D:/dev/eclipse/mye65/workspace/jmxjava.runtime.version:1.5.0_11-b03java.awt.graphicsenv:sun.awt.Win32GraphicsEnvironmentjava.endorsed.dirs:D:/Program Files/MyEclipse 6.5/jre/lib/endorsedos.arch:x86java.io.tmpdir:C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/line.separator: java.vm.specification.vendor:Sun Microsystems Inc.user.variant:os.name:Windows 2003sun.jnu.encoding:GBKjava.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/binjava.specification.name:Java Platform API Specificationjava.class.version:49.0sun.management.compiler:HotSpot Client Compileros.version:5.2user.home:C:/Documents and Settings/Administratoruser.timezone:Asia/Shanghaijava.awt.printerjob:sun.awt.windows.WPrinterJobfile.encoding:GBKjava.specification.version:1.5java.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.jaruser.name:Administratorjava.vm.specification.version:1.0java.home:D:/Program Files/MyEclipse 6.5/jresun.arch.data.model:32user.language:zhjava.specification.vendor:Sun Microsystems Inc.awt.toolkit:sun.awt.windows.WToolkitjava.vm.info:mixed modejava.version:1.5.0_11java.ext.dirs:D:/Program Files/MyEclipse 6.5/jre/lib/extsun.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/classesjava.vendor:Sun Microsystems Inc.file.separator:/java.vendor.url.bug:http://java.sun.com/cgi-bin/bugreport.cgisun.io.unicode.encoding:UnicodeLittlesun.cpu.endian:littlesun.desktop:windowssun.cpu.isalist:pentium_pro+mmx pentium_pro pentium+mmx pentium i486 i386 i86