Java开发和运行环境的搭建(详细教程)
對JDK、JRE、Java 的認識
JDK 是Java Development Kit的縮寫,即Java開發工具集。JDK是整個Java的核心,包括了Java運行環境(JRE)、Java開發工具和Java基礎類庫。
JRE 是Java Runtime Environment的縮寫,即Java運行時環境。Java程序運行時必需要JRE的支持。
Java的平臺版本:
Java分為J2SE、J2EE和J2ME三個不同的平臺版本,即標準版(Java 2 Platform, Standard Edition)、企業版(Java 2 Platform, Enterprise Edition)和微型版(Java 2 Platform, Micro Edition)。從Java 1.5(或者Java 5.0)開始,它們被改稱為Java SE、Java EE和Java ME。
各平臺版本之間的差別在于適用范圍不同:
- 標準版平臺(Java SE)允許開發和部署在桌面、服務器、嵌入式和實時環境中使用的Java應用程序。另外,Java SE包含了支持實現Java Web服務的類庫,因此標準版是企業版的基礎。
- 企業版平臺(Java EE)幫助開發者開發和部署Java Web應用。企業版提供Web服務、組件模型、管理和通信API,可以用來實現企業級的面向服務的體系結構(Service-Oriented Architecture, SOA)和Web 2.0 應用程序。
- 而微型版平臺(Java ME)主要用于移動設備和嵌入式設備,如手機、PDA、電視機頂盒等等。微型版包括靈活的用戶界面、健壯的安全模型、許多內置的網絡協議、以及對可動態下載的在線和離線應用的支持。基于Java ME規范的應用程序與普通Java程序一樣,只需編譯一次,即可在許多設備上運行。
Java的版本:
- 1995年5月23日,Java語言誕生
- 1996年1月,JDK 1.0發布
- 1997年2月18日,JDK 1.1發布
- 1998年12月4日,J2SE 1.2發布,1.2版及其之后的版本也被稱為Java 2
- 1998年12月8日,Java 2企業版發布
- 2000年5月8日,J2SE 1.3發布
- 2002年2月13日,J2SE 1.4發布
- 2004年9月30日,J2SE 1.5發布,J2SE 1.5版也被稱為Java 5.0
- 2006年12月,Java 6.0發布
- 2010年9月,Java 7.0發布
- ……
Java運行環境搭建
——Windows下 JDK 的安裝:——
1. 下載JDK/JRE:
首先,訪問Oracle公司的Java SE的下載 主頁,選擇一個版本(目前最新版為Java SE 7),如下圖:
此頁面包含多個版本的JDK、JRE、幫助文檔、源代碼等下載內容的鏈接。如果不是Java程序的開發者,僅僅想在自己的系統中運行Java程序,那么只需要一個JRE就可以了;如果想使用Java開發自己的應用程序,則需要下載JDK,其中已包含JRE,因此下載了JDK后無需再單獨下載JRE。
這里以下載Java SE 7的JDK為例,點擊相應的Download按鈕,轉到下載頁面:
在此頁面中,包含了對應各種操作系統的JDK下載鏈接,選擇自己系統對應的JDK,將其下載到本地硬盤上。注意,在下載之前需要先閱讀“Oracle Binary Code License Agreement for Java SE”,必須接受其中的條款才能下載JDK(選中“Accept License Agreement”)。
2. 安裝JDK/JRE:
無論是在Windows還是在Linux下安裝JDK都很簡單,與安裝其他程序沒什么不同。(因為我沒有其他操作系統的環境,也沒用過其他系統,因此不清楚在其他操作系統下的安裝方法,但想來應該也不是難事——至少不會比安裝其他程序難)。
在Windows中,雙擊剛才下載的“jdk-7-windows-i586.exe”文件,就會打開安裝界面。點擊“下一步”按鈕,可以在此選擇需要安裝的組件和安裝目錄,窗口右側是對所選組件的說明,包括組件功能和所需的磁盤空間;可以點擊“更改”按鈕來改變安裝目錄。點擊“下一步”即開始正式安裝。安裝完畢后,將會顯示安裝已完成的信息,點擊“完成”按鈕即可完成安裝。
來到安裝文件夾下,即可以看到已安裝的JDK的目錄結構。(注意其中包含名為“jre”的文件夾,這就是前面說的JDK包含JRE的原因所在)
整個安裝過程如下面幾幅圖所示:
注意1: 操作系統分為32位操作系統和64位操作系統,對應地,JDK也分為32位版和64位版(名稱帶有“i586”或“x86”的為32位版,帶有“x64”則表示該JDK為64位版)。64位版JDK只能安裝在64位操作系統上,32位版JDK則既可以安裝在32位操作系統上,也可以安裝在64位操作系統上。原因是64位的操作系統能夠兼容32位的應用程序。換句話說,即使CPU是64位的,但如果安裝的操作系統是32位的,那么也無法安裝64位版的JDK。
注意2: 在安裝 JDK 完畢后,會跳出讓你繼續安裝 JRE 的界面,因為已經安裝完 JDK,其實已經帶有 JRE,這里可以取消不再安裝 JRE。
——Linux下 JDK 的安裝——
在Linux中安裝JDK與安裝其他程序相同。下載時可以選擇.rpm或.tar.gz格式的安裝文件,這里以后者為例進行說明。
首先解壓縮下載的文件,輸入命令“tar -xf jdk-7-linux-i586.tar.gz -C /usr”,將文件解壓到/usr目錄下,這樣就完成了安裝(如圖):
3. 設置環境變量:
環境變量是指在操作系統中用來指定操作系統運行環境的一些參數,比如臨時文件夾位置和系統文件夾位置等。環境變量相當于給系統或應用程序設置的一些參數。
編譯或運行Java程序時,都是基于命令行的,因此在此之前必須設置一些環境變量的值。有些Java IDE(集成開發環境)內置了JDK,因此使用這些IDE時可以不指定環境變量。還有些程序需要個性化的環境變量(如Apache Tomcat需要JAVA_HOME環境變量)。
與JDK或JRE的使用有關的是PATH、CLASSPATH等幾個環境變量。這里先解釋一下這些變量的含義:
PATH變量用來告訴操作系統到哪里去查找一個命令。如果清空 PATH 變量的值,在Windows中運行一個外部命令時,將提示未知命令錯誤(當然,在Linux中也是一樣):
注意: 在Windows中,如“dir”、“cd”等命令是內部命令,類似于DOS中的常駐命令。這些命令在命令行窗口啟動時會自動加載到內存中,不需要到磁盤上去尋找對應的可執行文件,因此即使清空了PATH變量的值也不會影響這些命令的使用。然而,像“java”這樣的外部命令,在執行時必須先由操作系統到指定的目錄找到對應的可執行程序,然后才能加載并運行。到哪里去尋找這些程序就是依靠PATH變量來指定的。Linux也是類似,甚至可以說在Linux中,PATH環境變量更為重要,因為Linux的很多基本命令都屬于外部命令,如“ls”、“mkdir”等。當將PATH變量清空后,這些命令都將無法使用(當然,還是有一些內部命令我們仍然可以使用)。
CLASSPATH是編譯或運行Java程序時用來告訴Java編譯器或虛擬機到哪里查找Java類文件的,后面會對其做詳細介紹。
在Windows XP或之前的版本中,依次點擊“右鍵我的電腦” -> “屬性” -> “高級” -> “環境變量”;在Windows Vista和Windows 7中則依次點擊“右鍵我的電腦” -> “屬性” -> “高級系統設置” -> “高級” -> “環境變量”,打開環境變量設置窗口:
新建一個用戶變量,名稱為PATH,值為“C:\Program Files(x86)\Java\jdk1.7.0\bin”(還記得前面JDK安裝到哪個目錄嗎?),點擊“確定”按鈕。然后用同樣的方法新建一個CLASSPATH變量,暫時將值設置為“.”(英文句號)。為什么說CLASSPATH的值是暫時的,后面會解釋。
設置完成后,環境變量設置窗口如下圖所示。點擊確定按鈕,環境變量設置完成。
注意: 在Windows中,環境變量分為“用戶變量”和“系統變量”,它們的區別是,“用戶變量”只對當前的用戶起作用,而“系統變量”則對系統中的所有用戶起作用。如果希望在多個用戶之間共享環境變量的設置,可以將這些環境變量設置為系統變量,否則,應該使用用戶變量,避免影響其他用戶。在Linux中也有類似的概念,接下來會講到。
在Linux中,可以通過編輯“~/.bashrc”文件來修改環境變量。在最后添加下面幾行腳本,然后保存并退出:
JAVA_HOME=/usr/jdk1.7.0
JAVA_BIN=/usr/jdk1.7.0/bin
PATH=PATH:PATH:JAVA_HOME/bin
CLASSPATH=.
export JAVA_HOME JAVA_BIN PATH CLASSPATH
注意: Linux中,每個用戶的home目錄下都有.bashrc文件,這個文件用來保存用戶的個性化設置,如命令別名、路徑等,當然也可以用來定義環境變量。此文件是與每個用戶相關的,一個用戶的設置不會影響到其他用戶,在這里設置環境變量相當于前面講的Windows的用戶環境變量。Linux中全局設置通常保存在“/etc/profile”文件中。另外,Linux中PATH和CLASSPATH的分割符都是“:”(冒號),而Windows中是“;”(分號)。
當環境變量設置完成后,在Windows中打開新的命令行窗口,在Linux中使用“source ~/.bashrc”命令重新加載.bashrc文件,即可使新的環境變量生效。輸入“java -version”命令,應該會打印出類似下圖所示的內容:
Windows命令行的輸出:
Linux下輸出一樣。
對以上步驟補充說明幾點:
可以在Windows命令行或Linux Shell中使用命令設置環境變量。例如,在Windows中可以使用“set var_name=some value”,在Linux中使用“var_name=some value”,這種方式與上面介紹的方式的區別在于:這種方式的設置是臨時性的,當重新啟動一個新的命令行窗口(Windows)或重新登錄(Linux)后,這些臨時變量就會丟失。
JDK版本混亂:有時候,使用“java -version”命令可以打印出JDK的版本信息,但卻與我們剛剛安裝的JDK版本不一致。比如我們明明安裝的是JDK 7,但卻打印出JDK 6的版本信息,如下圖所示:
檢查PATH變量,發現其中有一個路徑為“C:\Program Files (x86)\Java\jdk1.6.0_25\bin”,原來我的系統中安裝了兩個版本的JDK,JDK 6和JDK 7。由于此JDK 6在系統環境變量PATH中,而Windows查找命令對應的程序時,首先查找的是系統變量,當找到了一個可用的java程序時,Windows將運行這個程序,而不再進一步查找。也就是說,系統PATH環境變量屏蔽了用戶PATH環境變量。
不光如此,靠近PATH變量前部的路徑中的程序將屏蔽其之后的路徑中的同名程序。如同樣是在系統PATH變量中,C:\Program Files(x86)\Java\jdk1.6.0_25\bin;C:\Program Files (x86)\Java\jdk1.7.0\bin,那么JDK 6仍然將屏蔽JDK 7,如果將它們的順序交換:C:\Program Files(x86)\Java\jdk1.7.0\bin;C:\Program Files (x86)\Java\jdk1.6.0_25\bin,結果則相反。
不只是用戶安裝了多個版本的JDK時可能導致JDK版本的混亂,而且很多軟件產品自身會包含JDK,即使用戶只安裝了一個JDK,但仍有可能與這些軟件中的JDK互相屏蔽(如果這些軟件同時也設置了環境變量的話)。例如Oracle數據庫、MyEclipse等都包含自己的JDK。
在Windows下我還遇到過一個問題,那就是居然在Windows\system32目錄下發現了java.exe、javaw.exe、javaws.exe三個文件,因為系統PATH變量中此目錄處于較靠前的位置,因此很容易將用戶自己安裝的JDK屏蔽掉。
有三種方法來解決這個問題:
第一種方法是使用絕對路徑,例如我們運行命令時使用"C:\Program Files(x86)\Java\jdk1.7.0\bin\java.exe"(當然,.exe可以省略)而不是“java”。使用絕對路徑時,操作系統會直接根據路徑定位到命令所在的目錄,不再通過PATH變量來查找。這種方法的優點是絕對不會導致命令的覆蓋,但缺點也很明顯:必須輸入完整的路徑來運行命令(通常也很長)。
需要注意的是,當絕對路徑中存在空格時(如上面的例子那樣),需要將命令用英文雙引號引起來。在設置PATH變量時不需要這樣做,操作系統會自動完成這件事。
第二種方法是將自己安裝的JDK路徑設置到系統PATH變量的開頭,這樣,操作系統查找命令時就會最先查找我們設置的路徑。但這種方法的缺點就是可能會影響其他用戶(設置在了系統PATH變量中),并且可能會影響其他程序(其他的JDK被我們的屏蔽了)。
關于 java 環境變量作用(網上的通俗理解版)
快速配置:
計算機(右鍵)-屬性-高級系統設置-環境變量
新建系統變量 : JAVA_HOME
C:\Program Files (x86)\Java\jdk1.6.0_10(你的JDK安裝路徑)
修改系統變量 :PATH
%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin 或者直接%JAVA_HOME%\bin
新建系統變量:CLASSPATH
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar (要加.表示當前路徑)
檢驗是否配置成功:
cmd—
java -version 、
javac、
java
環境變量詳細解釋:
來源網絡,解釋1:
path:是一個環境變量,就像一個程序中你聲明的一個變量有用戶級和系統級,可以理解為全局和局部變量。變量當然是拿來用的,這樣系統就可以根據path=value的value來找到相應的可執行文件,就像你在運行里輸入cmd、msconfig、notepad等一樣,現在你可以輸入path里包含的命令如:javac。
classpath:是告訴一些工具軟件如Tomcat之類的,你的JDK在哪,或是你新包含的什么jar包。簡單來說它就是類的路徑,在編譯運行java程序時,如果有調用到其他類的時候,在classpath中尋找需要的類。總的來說“path”的作用就是用來添加dos中使用的”javac”、“ -version”等命令。而“classpath”則是為了能在dos中調用jdk中的類。
來源網絡,解釋2:
Windows下JAVA用到的環境變量主要有3個,JAVA_HOME、CLASSPATH、PATH。
JAVA_HOME指向的是JDK的安裝路徑,如C:\JDK_1.4.2,在這路徑下你應該能夠找到bin、lib等目錄。值得一提的是,JDK的安裝路徑可以選擇任意磁盤目錄,不過建議你放的目錄層次淺一點,如果你放的目錄很深,比如C:\XXXXXX\xxxxx\XXXX\xxxx\XXXX\xxxx\XXXX\xxx……
設置方法:
JAVA_HOME=C:\JDK_1.4.2
PATH環境變量原來Windows里面就有,你只需修改一下,使他指向JDK的bin目錄,這樣你在控制臺下面編譯、執行程序時就不需要再鍵入一大串路徑了。設置方法是保留原來的PATH的內容,并在其中加上%JAVA_HOME%\bin (注,如果你對DOS批處理不了解,你可能不明白%%引起來的內容是什么意思;其實這里是引用上一步設定好的環境變量JAVA_HOME,你寫成C:\JDK_1.4.2也是可以的;你可以打開一個控制臺窗口,輸入echo %JAVA_HOME%來看一下你的設置結果) :
PATH=%JAVA_HOME%\bin;%PATH%
同樣,%PATH%是引用以前你設置的PATH環境變量,你照抄以前的值就行了。
CLASSPATH 環境變量我放在最后面,是因為以后你出現的莫名其妙的怪問題80%以上都可能是由CLASSPATH 設置不對引起的,所以要加倍小心才行。 CLASSPATH=.;%JAVA_HOME%\lib\tools.jar
首先要注意的是最前面的”.;”,如果你看不清,我給你念念——句點分號。這個是告訴JDK,搜索CLASS時先查找當前目錄的CLASS文件——為什么這樣搞,這是由于LINUX的安全機制引起的,LINUX用戶很明白,Windows用戶就很難理解(因為Windows默認的搜索順序是先搜索當前目錄的,再搜索系統目錄的,再搜索PATH環境變量設定的) ,所以如果喜歡盤根究底的朋友不妨研究一下LINUX。
為什么CLASSPATH后面指定了tools.jar這個具體文件?不指定行不行?顯然不行,行的話我還能這么啰嗦嘛!這個是由java語言的import機制和jar機制決定的,你可以查資料解決。 具體的設定方法: win2k\xp用戶右鍵點擊我的電腦->屬性->高級->環境變量,修改下面系統變量那個框里的值就行了。
win9x用戶修改autoexec.bat文件,在其末尾加入:
set JAVA_HOME=C:\JDK_1.4.2
set PATH=%JAVA_HOME%\bin;%PATH%
set CLASSPATH=.;%JAVA_HOME%\lib\tools.jar
就可以了。
編譯并運行程序(示例)
經過了以上的步驟,JDK的環境就搭建好了,此時,可能需要再編譯并運行一個Java例子程序來對剛搭建的環境做最終的檢驗。在這一節中,也會順便講到如何編譯和運行一個Java程序,以及CLASSPATH的作用。
此程序包含兩個.java文件:ExceptionDemo.java和HelloWorldException.java,前者屬于main包,而后者位于exceptions包(雖然它位于test\exceptions文件夾,這樣安排的目的是為了更好地描述CLASSPATH的作用):
下面是它們的源代碼:
(1) ExceptionDemo.java:
1. package main; 2. import exceptions.HelloWorldException; 3. public class ExceptionDemo { 4. /** 5. * 6. * @param args 7. * @throws HelloWorldException 8. */ 9. public static void main(String[] args) 10. throws HelloWorldException { 11. throw new HelloWorldException(); 12. } 13. }(2) ExceptionDemo.java:
1. package main; 2. import exceptions.HelloWorldException; 3. public class ExceptionDemo { 4. /** 5. * 6. * @param args 7. * @throws HelloWorldException 8. */ 9. public static void main(String[] args) 10. throws HelloWorldException { 11. throw new HelloWorldException(); 12. } 13. }(3) HelloWorldException.java:
1. package exceptions; 2. public class HelloWorldException extends Exception { 3. private static final long serialVersionUID = 8679349130620681877L; 4. public HelloWorldException() { 5. super("Hello World!"); 6. } 7. }此程序仍然是一個經典的HelloWorld程序(雖然這次它是以很不友好的方式向世界問好——通過拋出異常)。
要編譯這個程序,首先嘗試第一種方法(下面的操作是在Windows命令行下進行的,Linux與此類似):進入src文件夾,輸入“javac main\ExceptionDemo.java”,但編譯報錯:
為什么會提示找不到HelloWorldException呢?那是因為該Java文件位于“test\exceptions\”目錄下,但它的包名卻是“exceptions”,從當前的src目錄,javac無法找到exceptions目錄,因為“src\exceptions”目錄是不存在的。
接下來,我們嘗試第二種方法:由src目錄進入test目錄,運行“javac ..\main\Exceptiondemo.java”:
編譯居然通過了!可以看到沒有報錯,并且main目錄下生成了ExceptionDemo.class文件(Java字節碼文件),說明編譯確實成功了。但是為什么?我們使用了“..\main\Exceptiondemo.java”,這明顯不是ExceptionDemo的包路徑,為什么編譯器卻不報錯呢?另外我們還注意到,我錯誤地將“ExceptionDemo.java”寫成了“Exceptiondemo.java”,即將字母“D”的大小寫弄錯了,編譯器同樣沒有報錯。
原來,javac只是將“..\main\Exceptiondemo.java”當做普通路徑來尋找Java源程序文件,找到后即開始編譯此文件,而當其在編譯過程中發現程序還引用了其他類時(如ExceptionDemo.java中引用了HelloWorldException類),就會暫停對當前文件的編譯,開始尋找這個引用的類文件,如果未找到,那么將會報告錯誤,編譯失敗。前一種方法就是因為沒有找到HelloWorldException類而出錯的。
那么javac程序是如何查找程序引用的其他類的呢?答案是按照CLASSPATH指定的路徑加上程序所引用類的包名來查找的。CLASSPATH默認為“.”,即當前路徑(我們之前也設置了CLASSPATH的值為“.”,但即使不設置,javac也會默認以當前路徑為起點來查找所引用的類文件)。
因此在這里javac會檢查“src\test\exceptions\”中是否有HelloWorldException.class文件,如果有,則繼續檢查其中是否有HelloWorldException.java文件,如果兩者都存在,則檢查HelloWorldException.class是否比HelloWorldException.java更新,如果答案是肯定的,則加載HelloWorldException.class并繼續編譯ExceptionDemo.java。而如果比較結果是HelloWorldException.java更新,或者不存在HelloWorldException.class,則說明需要重新編譯HelloWorldException.java文件。如果只有.class文件而不存在.java文件,則加載之并繼續編譯ExceptionDemo.java。
如果沒有找到目標文件(HelloWorldException.class或HelloWorldException.java),那么javac將報告錯誤(如之前那樣)。
也就是說,編譯是遞歸進行的:當程序中引用了其他類時,javac會判斷是否需要編譯這些類,如果需要,則javac會首先編譯它們,如果這些類再次用到了其他的類,javac將再次重復此過程,直到完成全部編譯。只要在此過程中有任何類沒有找到,或者在其中發現了任何錯誤,那么javac將報告錯誤并中止編譯(javac可能在中止之前盡可能多地編譯,以盡量多地向用戶報告程序中的錯誤)。
可以用下面的圖來形象地展示這一過程:
至于我們將大小寫弄錯了但javac卻沒有報錯的原因,其實前面的說明已經隱含了解釋:是因為javac只是將命令中的.java文件當做普通文件,又由于Windows是不區分大小寫的,因此不會報錯。如果換成Linux系統,將會提示文件無法找到的錯誤。
默認的CLASSPATH是當前目錄(“.”),我們也可以設置為需要的路徑,讓javac據此查找類文件(這就是前面所說的為什么只是暫時將CLASSPATH設置為“.”的原因)。在這個例子中,我們設置CLASSPATH為“.;D:\workspaces\workspace_v1.1\my-test\src\test”,注意Linux中分隔符為“:”(冒號)。然后在src目錄下就可以使用命令“javac main\ExceptionDemo.java”進行編譯:
實際上,此時在任何目錄都可以對ExceptionDemo.java進行編譯,只是文件的路徑要適當更改。例如我們在D盤根目錄輸入以下命令編譯:
這是因為設置了CLASSPATH后,javac總能找到HelloWorldException類。
有時候必須使用CLASSPATH:當涉及到的類很多時,而這些類并不在同一個目錄下,此時我們只能使用CLASSPATH來指定這些類的路徑——我們無法同時處于多個類的“當前目錄”下。
另外一個需要注意的問題是,JDK包含的Java基礎類(例如java.lang包中的類)并不需要指定CLASSPATH——Java知道如何找到它們。
編譯完成后,運行我們的例子,例子將拋出一個異常,并向世界問好:
注意,必須輸入完整的包名和類名(不需要.class后綴),且大小寫不能弄錯(因為Java是區分大小寫的)。完整的包名+類名在Java中稱為類的完全限定名。
至此為止,我們成功地搭建起了Java開發和運行環境!
更新于 2017-11-13
總結
以上是生活随笔為你收集整理的Java开发和运行环境的搭建(详细教程)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何完全屏蔽Chrome的提示:请停用以
- 下一篇: 计算机及其配件和参数知识科普