一:用戶變量和系統變量的區別
右擊我的電腦、屬性、高級系統設置、環境變量。
對話框的上面為Administrator的用戶變量,對話框的下面為系統變量。我們所說的環境變量一般指系統環境變量,對所有用戶起作用 ,而用戶環境變量只對當前用戶起作用。
有的時候我們會看到在用戶變量和系統變量中都存在某一個環境變量,比如path(可運行文件的搜索路徑), path變量的值是用戶變量中的值與系統變量中的值的疊加。(即用戶變量path的值其實是 用戶變量設置中的path值 和 系統變量中的值都有)。
例如:
用戶變量中的Path:
C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\Scripts\;C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\;G:\Android\sdk\platform-tools;G:\altera\13.1\modelsim_ase\win32aloem
系統變量中的Path:
C:\ProgramData\Oracle\Java\javapath;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\ProgramFiles\ATITechnologies\ATI.ACE\Core-Static;G:\matlab\runtime\win32;G:\matlab\bin;C:\ProgramFiles\Java\jdk1.8.0_91\bin;%QUARTUS_ROOTDIR%\bin;G:\git\Git\cmd;D:\MySQL\bin;
在命令窗口中,這些可執行文件都可以直接運行,而不用去某個具體的文件夾下運行。
這個問題在linux下面就相對好理解一些,系統變量都在/etc/profile文件里面,而用戶的變量則在~/.bash_profile(如果用的是bash的話),每個用戶的用戶目錄對其他用戶不可見。假設有a,b,c三個用戶,你在a的變量文件中寫入語句在屏幕上述出a,在b的輸出b,c的什么都不輸出,系統文件輸出sys,那么當你用a用戶登陸時,輸出a;用戶b登陸輸出b,用戶c則輸出sys.
參考:http://www.cnblogs.com/zhwl/p/3338294.html
Windows系統變量匯總:http://blog.163.com/cayyenne%40126/blog/static/121862614201019082750/
二:Java環境變量配置
Windows下JAVA用到的環境變量主要有3個,JAVA_HOME、CLASSPATH、PATH。下面逐個分析。
(1)JAVA_HOME指向的是JDK的安裝路徑。設置方法:JAVA_HOME= C:/Program Files/Java/jdk1.6.0_21。
(2) PATH環境變量原來Windows里面就有,你只需添加一個路徑(JDK的bin目錄路徑):%JAVA_HOME%/bin 。(%%引起來的其實就是引用上一步設定好的環境變量JAVA_HOME,直接寫成C:/Program Files/Java/jdk1.6.0_21/bin也是可以的)。
(3)CLASSPATH環境變量, 作用是指定類搜索路徑,JVM就是通過CLASSPATH來尋找類的。我們需要把jdk安裝目錄下的lib子目錄中的dt.jar和tools.jar設置到CLASSPATH中,當然,當前目錄“.”也必須加入到該變量中。這里CLASSPATH為:CLASSPATH= .;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar
三:JVM的ClassLoader加載流程
(1)JVM啟動,運行bootstrap classloader(啟動類加載器),該加載器自動加載了Java核心API(其中包括ExtClassLoader和AppClassLoader),這些基礎類庫在%JAVA_HOME%\jre\lib目錄下。(補:通過親委派模型保證了基礎類庫只會被Bootstrap ClassLoader加載,這也就保證了基礎類的唯一性)
(2)然后調用ExtClassLoader加載擴展API,這些擴展類庫在%JAVA_HOME%\jre\lib\ext目錄下,有時候我們也要自己import這里面的類,但是並沒有基礎類庫用的頻繁。
(3)最后,AppClassLoader加載CLASSPATH目錄下定義的class,(二)中設置的dt.jar和tools.jar似乎與遠程調用和UI有關(一般用不到)。
一般情況下我們不設置CLASSPATH也沒關系,具體原因參考下面兩篇博文:
《java 也可以不配置 classpath》http://blog.csdn.net/deitytu/article/details/11533123
《詳細說明JDK環境變量中dt.jar、tools.jar等變量值的作用》 http://blog.csdn.net/ns_code/article/details/18547959