Question 1Java環境變量的配置及為什麼要配置環境變量
Q1.1為什麼要配置環境變量
在學習JAVA的過程中,涉及到多個環境變量(environment variable)的概念,如PATH。正确地配置這些環境變量,是能夠順利學習、開發的前提。而經常出現的問題是:我們能夠按照提示一步一步地正确配置,但時間一長就忘了,出現了問題也無從下手。究其原因,就是對這些概念沒有了解,知其然但不知其是以然。下面的内容,就是幫助大家知其是以然。
基本原理
環境變量(environment variables)一般是指在作業系統中用來指定作業系統運作環境的一些參數,如:臨時檔案夾位置和系統檔案夾位置等。
環境變量是在作業系統中一個具有特定名字的對象,它包含了一個或者多個應用程式所将使用到的資訊。例如Windows和DOS作業系統中的path環境變量,當要求系統運作一個程式而沒有告訴它程式所在的完整路徑時,系統除了在目前目錄下面尋找此程式外,還應到path中指定的路徑去找。使用者通過設定環境變量,來更好的運作程序。
JAVA的初學者,必須要學會配置PATH環境變量,否則無法編譯、運作JAVA程式。那麼,為什麼要配置PATH環境變量呢?PATH環境變量是做什麼的呢?我們從一個常見的問題入手。
當我們安裝好JAVA後,若沒有正确配置PATH環境變量,則在指令行視窗(開始->運作->輸入cmd,回車)下運作指令java -version(顯示JAVA的版本)指令時,會出現如下的錯誤提示資訊:

這條錯誤資訊的意思是,你要求運作的“java”這條指令我不認識,不知道是個什麼玩意兒。那麼究竟這個“java”指令是何方神聖呢?在JDK的安裝目錄下(我的是D:\Java\jdk1.6.0_24),有一個bin目錄。打開此目錄,會發現大量的可執行檔案,字尾名為exe的檔案。其中有一個可執行檔案即為java.exe。現在在指令行視窗下把目前目錄切換到這個bin目錄下(Shift+右鍵)。
在此目錄下,運作dir指令,顯示目前目錄下的所有檔案和目錄。從顯示結果中,我們可以清楚地看到“java.exe”這個檔案。如下圖所示:
實際上我們執行“java”指令,就是要運作“java.exe”這個可執行檔案(我們運作其他指令,本質上也是要執行某個程式檔案)。我們現在再來執行 java -version 這條指令試試。在指令行視窗下鍵入java -version,回車,結果如下圖所示:
看來這次執行成功了。執行java -?可檢視此指令的幫助資訊。可以看到它有很多選項,-version隻是其中之一。另外一種方式是,寫出這些可執行檔案的完整(絕對)路徑(例如:D:\Java\jdk1.8.0_31\bin\java -version),就可以在任何目錄下執行了。讀者可自行嘗試。
與java指令類似,javac指令目前也能在bin目錄下執行,但到其他目錄下就隻能寫出其完整路徑了。在學習JAVA的過程中,我們經常需要使用javac和java這兩條指令來編譯、運作我們的JAVA程式。難道我們每次運作這兩條指令都要先切換到bin目錄下嗎或寫出一長串的絕對路徑嗎?能不能有一個辦法,讓我們能夠在任何目錄下都能自如地運作這些指令呢?
明白了這些,我們就把bin目錄的完整路徑添加到PATH中。在指令行視窗下,可使用set指令完成此類的任務。直接運作set,會顯示系統目前所有環境變量的值,運作set /?,會顯示關于此指令的幫助資訊。
使用set指令設定環境變量值的格式為:set 環境變量名=環境變量值。我們可以使用指令set path=D:\Java\jdk1.8.0_31\bin将java等程式檔案所在的目錄添加到PATH環境變量中(Windows下環境變量名不區分大小寫,這與UNIX不同)。但是這樣會使PATH的值隻有“D:\Java\jdk1.8.0_31\bin”,它預先設定供其他程式使用的值就都被覆寫了。是以,我們應該把值“D:\Java\jdk1.6.0_24\bin”追加到PATH中。為此,我們可以使用如下指令:
set path=%path%;D:\Java\jdk1.8.0_31\bin
把PATH放在兩個百分号之間,指把PATH原有的值取出。其後的分号表示分隔不同的路徑值,之後才是我們要添加的值。注意,請在英文輸入法狀态下使用此指令。現在我們轉到任意一個目錄下執行java -version指令試試。結果如下圖所示:
可見運作完全成功。但是這種使用set指令的方式設定的環境變量隻對目前指令行視窗有效。一旦關閉此視窗,再次運作另一個指令行視窗時,PATH環境變量還是原來的值。是以,我們必須在Windows下修改PATH環境變量。步驟如下:
右擊桌面“我的電腦”圖示->屬性->進階->環境變量,就打開了了設定環境變量的對話框。上面部分是為某個使用者設定。Windows設計為可多使用者使用一台機器,每人一個賬戶。為某個賬戶設定的變量隻對該使用者有效。下面部分是設定系統變量,對系統中的每個使用者有效。現在一般電腦都隻有一個使用者,即Administrator。是以隻需要為此賬戶設定即可。找到PATH環境變量,點“編輯”。在“變量值”框内現有值的後面輸入英文輸入法的分号,然後添加你想添加的值(在這裡是D:\Java\jdk1.8.0_31\bin)。一路确定,OK!
現在再打開一個指令行視窗,輸入echo %path%指令檢視path的值(或者直接使用path指令亦可)。
現在,我們可以看到bin目錄已被添加到PATH中,再在任何目錄下運作java -version指令,均可成功。如下圖所示:
其實我們執行其他指令都是這個原理。舉例來說,當你顯示PATH的值時,你會發現第一個值是C:\WINDOWS\system32。在Windows下打開這個目錄,你會看到很多可執行檔案,它們的名字與我們常用的指令的名字是一緻的。也就是說,我們執行這些指令,實際上系統就是根據PATH的這個值找到了相應的可執行檔案,再運作這些檔案的結果。如attrib.exe檔案
它對應于attrib指令,這是顯示/設定檔案屬性的指令,如下圖所示:
現在我們通過指令set path=(等号右邊什麼都沒有,或随便寫點東西)來清除PATH的值,再來運作attrib指令試試。如下圖所示:
可以看出,完全相同的指令,現在已無法執行而報錯了。
下面再通過指令set path=c:\windows\system32(Windows下不區分大小寫,是以windows與WINDOWS都正确),把attrib.exe檔案所在的路徑添加到PATH中,再運作試試。如下圖所示:
很顯然,目前已能夠正确運作。另外一個常見的例子就是format.com(.com檔案是另一種可以執行的檔案),不過此指令是用來格式化的,實驗時請小心,不要由于失誤而格式化了某個盤。而且,根據上面的描述,在PATH環境變量未正确配置的時候,寫出這些檔案的絕對路徑(完整路徑),亦可以正确執行。讀者可自行實驗(在此聲明,由于已事先提醒,是以凡是由于誤操作帶來的資料丢失,概不負責!)。
Q1.2Java環境變量配置--圖文并茂版
win7,win8系統:右鍵點選桌面計算機→選擇屬性→選擇進階系統設定→選擇進階選 項卡→點選環境變量→下方系統變量中查找path→輕按兩下path
XP系統:右鍵點選桌面計算機→選擇屬性→選擇進階頁籤→點選環境變量→下方系統變量中查找path→輕按兩下path将jdk安裝目錄下的bin目錄添加到最左邊并添加分号
path環境變量的參照形配置方式
建立新的變量名稱:JAVA_HOME,為JAVA_HOME添加變量值:JDK安裝目錄,将path環境變量中JDK目錄修改,%JAVA_HOME%\bin;,path環境變量具有先後順序
我們配置成功後發現javac和java可以到處運作
Q1.3classpath環境變量的作用
如果你輸入一個指令,比如java,那麼系統是如何找到這個指令的呢?按照順序,系統先在目前目錄搜尋是否有java.exe, java.bat 等。 如果沒有,就得到系統的PATH(不區分大小寫)裡面查找。比如你的環境變量的PATH裡面有 C:\program files\java\jdk1.6\bin,那麼 系統會嘗試在這個目錄下面查找,并且找到了 java.exe 那麼就會執行它。是以 path 就是系統為了搜尋某個資源而配置的一個參數。 多個目錄之間用分号(linux裡面用冒号)分割。那麼CLASSPATH呢? 同樣的道理,當我們需要某個class時,系統會自動在CLASSPATH裡面搜尋,如果是jar,就自動從jar裡面查找,如果是普通的目錄,則在目錄下面按照package進行查找。但與PATH不同的是,預設的CLASSPATH是不包含目前目錄的,這也是CLASSPATH裡面要包含一個點的道理了。
Tomcat下的Web應用有兩個預置的classpath : WEB-INF/classes 和WEB-INF/lib啟動項目,項目就會加載這兩個目錄裡的資料。這是war包的規範.要改變預置的classpath比較麻煩,在Tomcat的配置檔案裡沒有發現類似的配置,要實作自己的classloader才能達到目的。一個在tomcat中運作的web應用.它的classpath都包括如下目錄:
我知道的有:
%tomcat%/lib
web-inf/lib
web-inf/classes
環境變量裡的classpath
總結:classpath這是一個定位資源的入口.classpath下 lib的優先級大于classes;
Q1.4classpath的配置
為什麼要配置classpath變量?配置classpath變量,才能使得java解釋器知道到哪裡去找标準類庫,這些标準類庫是别人已經寫好了的,我們隻管使用。比如我們常用到java.lang包中的類,在配置classpath變量後被設為預設導入,是以在寫程式時就不用import這個包了。那麼這些标準類庫在哪呢?在以JDK的lib目錄下以jar為字尾的檔案中:一個是dt.jar,一個是tools.jar,這兩個jar包都位于C:/jdk1.6.0/lib目錄下,是以通常我們都會把這兩個jar包加到我們的classpath環境變量的值為:.; C:\Program Files\Java\jdk1.5.0_17\\lib\tools.jar; C:\Program Files\Java\jdk1.5.0_17\\lib\dt.jar;
如何配置classpath變量?
在系統環境變量那一欄中點選建立classpath ,具體過程省略,下面隻列出其鍵值對:
變量名: CLASSPATH
變量值: .;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;
(注意,CLASSPATH最前面是有個 “.”的,表示目前目錄。用兩個%包圍JAVA_HOME這個變量的意思是引用變量的值,當然如果你不想這樣做,也可以這樣配置classpath的值為:.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar; 也就是用JAVA_HOME變量的值替換%JAVA_HOME%);
Q1.5内部指令、外部指令和批處理檔案
我們現在啟動一個指令行視窗,按上述的方法把PATH的值全部清除,然後再運作dir、cd等指令。出乎我們意料的是,它們仍然能夠正确執行。這,又是什麼原因呢?
我們來看看剛才那些報告錯誤的資訊,它們都提到了“内部指令”和“外部指令”的概念。那麼什麼是内部指令和外部指令呢?
内部指令和外部指令是DOS(disk operating system,微軟早期基于指令行的作業系統)時代的概念,百度百科的解釋是:内部指令是随每次啟動的COMMAND_COM裝入并常駐記憶體,而外部指令是一條單獨的可執行檔案。粗略地講,所謂内部指令就是最核心、使用最多的指令。為了提高響應速度,系統一啟動,這些指令就被加載到記憶體,是以可以迅速、直接地執行;而外部指令由于使用相對較少,就不預先加載到記憶體,當使用者使用時,再到硬碟上(c:\windows\system32)找相應的可執行檔案,然後加載到記憶體執行。像dir、cd等都是内部指令,而諸如attrib、format等都是外部指令。盡管DOS的時代早已成為了曆史,但某些操作卻必須在指令行模式下完成,對專業人士來說更是如此。是以,Windows産品一直保留着指令行模式這個工具。
另外一個概念就是批處理檔案(字尾名為.bat,來源于批量的英語單詞batch),它是另外一種可以執行的檔案。簡單地說,批處理檔案包含了很多DOS指令。檔案執行時,就一條一條地執行這些指令。不一定順序執行,像通用的程式設計語言一樣,它也有自己的流程控制。批處理檔案建立很簡單:用任何一個文本編輯器(如Windows的記事本)建立一個文本檔案,然後把字尾名改為.bat即可。建立好的批處理檔案,你也可以用文本編輯器打開,檢視它的“源代碼”。
Q1.6關于CATALINA_HOME環境變量的設定(适用于tomcat6/7)
Tomcat是一個免費開源的Servlet/JSP容器,深受廣大JAVA初學者喜愛。這其中需要設定CATALINA_HOME環境變量,值為tomcat安裝目錄(我的是d:\tomcat7),否則會出現如下的錯誤資訊:
這句話的意思就是沒有正确設定CATALINA_HOME環境變量,而此變量是運作Tomcat所必須的。而當你不理會這個資訊,在指令行視窗把目前目錄切換到tomcat安裝目錄下的bin目錄下,再執行批處理檔案startup.bat來啟動tomcat時,發現也可以成功。難道現在不需要CATALINA_HOME環境變量了嗎?
實際上,在startup.bat中,首先判斷CATALINA_HOME是否為空。若為空,就把目前目錄設為CATALINA_HOME的值。然後查找CATALINA_HOME所訓示的目錄下是否有個bin目錄,此bin目錄下是否有個叫做catalina.bat的批處理檔案(此檔案負責啟動tomcat)。若沒有,則把目前目錄的父目錄設為CATALINA_HOME的值,再重複上述的查找。若仍失敗,就報圖十所示的錯誤。是以,當你在tomcat安裝目錄下的bin目錄下運作startup.bat檔案時,它就會按照上面所說的第二種方式自動正确設定CATALINA_HOME的值,因為catalina.bat檔案就在tomcat安裝目錄下的bin目錄裡。
雖然在此種情況下能正确運作,但還是建議你正确設定CATALINA_HOME環境變量。與PATH不同的是,PATH系統本身就由,而CATALINA_HOME需要你自己“建立”,在“環境變量”視窗點“建立”即可。
為了能夠在任何目錄下都能運作tomcat安裝目錄下bin目錄裡的批處理檔案,如startup.bat,可把此目錄添加到PATH環境變量中(我的是d:\tomcat7\bin)。為了提高靈活性,可在PATH環境變量的最後添加上%catalina_home%\bin(與前一個值之間不要忘了用英文的分号隔開)。把catalina_home放置在兩個百分号之間,表示引用這個環境變量的值。這樣,當你把tomcat的安裝目錄換了以後,就隻需要修改catalina_home的值,而不需要修改PATH的值了,因為它可以自動計算出新的正确值。