理順JDK和環境變量

一、JDK的安裝

1、Java-Package choose

java_version

上述文檔翻譯:

  • JDK:針對Java開發者(Java developers)。包括了一個完整的JRE附加包工具,該專用JRE附加包的目的是提供開發,調試和模擬Java應用程序。

    JDK:Java SE Development Kit,Java開發環境。

  • Server JRE:針對的是在服務器上運行Java應用程序的管理員。用于在服務器上部署Java應用。包括了在服務器應用上所需要的JVM監控和公共工具,但是不包括瀏覽器集成(Java 插件)、自動更新、安裝。

  • JRE:針對的是在一個桌面環境上運行Java的最終用戶。覆蓋了大多數的最終用戶的需求,包含了在系統上運行Java程序所需要的一切

    JRE:Java Runtime Enviroment,Java運行環境。

2、3種安裝包解壓后的目錄結構及說明

詳見: JDK和JRE目錄結構

  • JDK目錄結構

    - java_dir
      | - jdk1.8.0
           | - bin  
           | - lib  
           | - db
           | - src.zip
           | - jre  // 專用JRE
                | - bin  
                | - lib  
           | ...
         | - jre1.8.0  // 公共JRE
              | - bin  
              | - lib  
    

    針對/java_dir/jdk/ 目錄進行說明:

    • bin:存放開發工具的可執行文件。
      • java,解釋器
      • javac,編譯器
      • javadoc,文檔工具,把API注釋提取成HTML文檔
      • jar,歸檔工具,把包結構打包成.jar文件
    • lib:開發工具所需要的類庫。
      • dt.jar
      • tools.jar
    • db:純Java開發的數據可 Derby,是一個開源的100%Java開發的關系數據庫
    • src.zip:所有java核心庫的源代碼
    • jre:java運行環境 - JVM
      • bin:存放JVM的執行命令。
        • java,解釋器
      • lib:JVM運行所需要的核心類庫。
        • rt.jar,引導類。(IDE中API的所在包)

    /java_dir/jre 目錄和java_dir/jdk/jre 目錄的內容是一樣的,都是用來運行Java程序的,即JVM。

  • Server-JRE目錄結構

    - server-jre_dir
            | - jdk1.8.0
                 | - bin  
                 | - lib  
                 | - db
                 | - src.zip
                 | - jre  // 專用JRE
                      | - bin  
                      | - lib  
                 | ...
    

    ?

  • JRE文件樹

    - jre_dir
      | -jre1.8.0  // 公共JRE
          | - bin  
          | - lib
    

    ?

3、JDK和JRE的結構辨析

**官方說明: ** JDK和JRE圖示 圖示說明

JDK_JRE

圖示說明:

Java概念圖將Java組件技術分級分類。

  • JDK所包含的組件:
    • Java語言
    • 工具和工具API
    • 部署
    • 用戶界面工具包
    • 集成庫
    • 其他基礎庫
    • Lang和Util基礎庫
    • Java虛擬機
  • JRE所包含的組件:
    • 部署
    • 用戶界面工具包
    • 集成庫
    • 其他基礎庫
    • Lang和Util基礎庫
    • Java虛擬機
  • Java SE API 所包含的內容:
    • 用戶界面工具包
    • 集成庫
    • 其他基礎庫
    • Lang和Util基礎庫

**分析: **

官方文檔中,可知JDK與JRE相比,獨有的部分是Java Language和Tools、Tools API。也就是說,JRE不具備Java應用程序開發的功能。

JDK = Server-JRE + JRE 。

  • 對于最終用戶:只需要Java運行環境來運行其電腦上的java程序;因此,只安裝JRE就可以了。
  • 對于服務器:需要編譯、運行Java應用,而不需要訪問Java應用;因此,只使用Server-JRE進行編譯、解釋。
  • 對于Java開發者:開發Java程序時要編譯、解釋,同時作為用戶要運行其他Java應用;因此使用JDK。
  • 平常所說的Java自動更新,是指公共JRE的更新,以便適應網站的技術更新;而不是JDK的自動更新。

javac和java命令:

jdk/bin 目錄下有javac和java命令(編譯、解釋);而在jdk/jre/binjre/bin 目錄下只有java命令(解釋)。


二、環境變量(Enviroment variable)的設置及作用

環境變量: 分為用戶變量和系統變量。

1、用戶變量(user variable)

只對當前用戶有效(windows下作用不大,linux下用處大),是為了減低自己所做的修改對他人造成的影響。

一般系統變量的路徑排在用戶變量之前,如果雙方都有的路徑,會使用系統變量中的值。

2、系統變量(System variable)

1、JAVA_HOME變量(約定名稱,供JDK、其他軟件使用)

顧名思義: 這是Java的家,就是JDK文件夾的所在位置(安裝路徑)。

新建JAVA_HOME路徑C:\Program Files\Java\jdk1.8.0_131

作用: 指向JDK的安裝目錄:

  • 1、像eclipse/intellij等軟件可以借助該變量自動定位JDK
  • 2、tomcat等軟件只認定這個變量來定位JDK
  • 3、使用變量,修改JDK位置更加靈活(CLASSPATH、PATH的引用)

2、CLASSPATH變量(約定名稱,專為JDK而使用)

顧名思義: 這是要查找的類/class文件的所在路徑,就是執行javac 命令時:要查找的類的位置和相關的類庫位置。

已經不需要新建CLASSPATH路徑了!!!.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

手工編譯.java文件的幾種情況:

假設C:\User\14002\Desktop\Print.java 是我們要編譯的java源文件。

情況一:Print.java只是繼承于Object類,且不需要引入外部.jar文件。

  • 1、絕對路徑編譯:

    打開DOS,處于任意路徑下,輸入:javac C:\User\14002\Desktop\Print.java 即可完成編譯。

  • 2、相對路徑編譯:

    進入ODS,進入該文件所在目錄后,輸入:javac Print.java 即可。

情況二:Print.java繼承其他類,或者要引入其他.jar文件。但是都在同一個目錄下。

  • 編譯方式和情況一相同。

情況三:Print.java繼承某個父類,如MyObject.java類。或者引用某個.jar文件,如MyJar.jar。但是都不在同一個目錄下。

  • 1、MyObject.class不在當前目錄中(C:\test\MyObject.class),需要手動指定該class文件所在目錄:

    javac -classpath C:\test\ C:\User\14002\Desktop\Print.java

  • 2、MyJar.jar不在當前目錄中(C:\test\MyJar.jar),需要指定位置:

    javac -classpath C:\test\MyJar.jar C:\User\14002\Desktop\Print.java

為什么javac命令能執行?

因為在PAHT路徑中配置的%JAVA_HOME%\bin 路徑幫助我們找到了該目錄下的javac.exe 執行命令。

CLASSPATH路徑的作用?

以下內容來自《Java編程思想》。

1、Java 解釋器的工作程序如下:

首先,java.exe找到環境變量CLASSPATH。

CLASSPATH 包含了一個或多個目錄,它們作為一種特殊的“根”使用,從這里展開對.class 文件的搜索。

從那個根開始,解釋器會尋找包名,并將每個點號(句點)替換成一個斜杠,從而生成從CLASSPATH 根開始的一個路徑名(所以package foo.bar.baz 會變成foo\bar\baz 或者foo/bar/baz;具體是正斜杠還是反斜杠由操作系統決定)。

隨后將它們連接到一起,成為CLASSPATH 內的各個條目(入口)。

以后搜索.class 文件時,就可從這些地方開始查找與準備創建的類名對應的名字。

此外,它也會搜索一些標準目錄——這些目錄與Java 解釋器駐留的地方有關。

2、CLASSPATH是Java編譯器(javac.exe)的一個環境變量。

它的作用是指定類搜索路徑,它與import、package關鍵字有關。

當你寫下improt java.util.* 時,編譯器面對import關鍵字時,就知道你要引入java.util這個package中的所有類。

但是編譯器如何知道你把這個package放在哪里了呢?

所以你首先得告訴編譯器這個package的所在位置。如何告訴它呢?就是設置CLASSPATH啦~

如果java.util這個package在c:\jdk\ 目錄下,你得把c:\jdk\這個路徑設置到CLASSPATH中去!當編譯器面對import java.util.* 這個語句時,它先會查找CLASSPATH所指定的目錄,并檢視子目錄java\util是否存在,然后找出名稱吻合的已編譯文件(.class文件)。如果沒有找到就會報錯!

當你自己開發一個package時,如果想要用這個package中的類;自然,你也得把這個package所在的目錄設置到CLASSPATH中去!

然而,使用JAR 文件時要注意一個問題:必須將JAR文件的名字置于類路徑里,而不僅僅是它所在的路徑。所以對一個名為grape.jar 的JAR 文件來說,我們的類路徑需要包括:CLASSPATH=.;D:\JAVA\LIB;C:\flavors\grape.jar

CLASSPATH的設定,對JAVA的初學者而言是一件棘手的事。所以Sun讓JAVA2的JDK更聰明一些。你會發現,在你安裝之后,即使完全沒有設定CLASSPATH,你仍然能夠編譯基本的JAVA程序,并且加以執行。

可以看出,CLASSPATH 里將會包含大量備用的搜索路徑。

但是,在JDK 1.5之后,就沒有必要配置CLASSPATH了:

因為1.5版本以上JDK:

  • 1、它會自動搜索當前路徑下的類文件
  • 2、而且使用Java的編譯和運行工具時,系統可以自動加載dt.jar(是關于運行環境的類庫,主要是swing的包)和tools.jar(是關于一些工具的類庫)文件中的Java類

詳見: JDK官方安裝、配置說明

3、PATH變量

**path變量的作用: **

windows系統根據環境變量中的PATH變量查找命令并執行,如果找不到則出現“XXX不是內部或外部命令,也不是可運行的程序或批處理文件”錯誤。

path變量名不分大小寫,應用程序或DOS界面會遍歷path的路徑來查找命令并調用。

path變量的應用舉例:

path路徑的作用是為DOS命令(cmd)預設一大串的可供搜索命令來匹配 的目錄路徑,比如在命令行想要調用mysql來登錄操作或者是使用git。

  • 想在DOS中使用mysql:

mysql.exe的路徑為:C:\Program Files\MySQL\MySQL Server 5.7\bin\mysql.exe

我們在PATH中添加一段路徑C:\Program Files\MySQL\MySQL Server 5.7\bin;那么,我們在cmd中直接就可以調用mysql -u root -p來進行進行登錄了。

因為有對應的PATH路徑存在,這條命令實際上找到了路徑下的mysql.exe來執行我們的命令。

  • 想在DOS中使用git:

git.exe的路徑為:C:\Program Files\Git\cmd\git.exe

我們在PATH中添加的路徑值為C:\Program Files\Git\cmd,同理,我們可以使用git 命令來執行。

舉一反三

  • 在DOS中啟動chrome:

你可以在用戶變量中的Path變量中加入chrome瀏覽器的路徑C:\Program Files (x86)\Google\Chrome\Application

那么你在cmd中輸入chrome,回車。即可啟動chrome瀏覽器。

因為chrome.exe的路徑是:C:\Program Files (x86)\Google\Chrome\Application\chrome.exe

配置JDK需要的PATH路徑

顧名思義: path就是路徑了,是在開發中調用相關命令如 javacjava 的所在位置。

作用: 是在任何目錄下都能調用與java開發相關的命令。

追加PATH路徑%JAVA_HOME%\bin;

4、路徑配置圖解:

- jdk1.8.0  (1、JAVA_HOME)
    | - bin  (3、PATH)
    | - jre
    | - lib
         | - dt.jar     -->  [2、CLASSPATH]
         | - tools.jar  -->  [2、CLASSPATH]  .  -->  [2、CLASSPATH]

注意: 現在已經不需要配置CLASSPATH路徑了。

5、MS-DOS下手動編譯、執行java文件

Dos界面: 就是windows下的MS-DOS 方式,cmd是command的縮寫。可以執行一些命令。

1、在.../user/desktop/ 桌面上生成Print.java 文件:

public class Print {

    public static void main(String[] args){
        for (int i = 0; i < args.length; i++) {
            System.out.println(args[i]);
        }
    }

}

作用:打印傳入的每個參數。

String[] args 的作用是:在Docs界面,把執行.class 文件時附帶傳進的所有參數(以空格隔開)分別存入args這個字符數組中;之后可以使用args這個數組中的參數。

2、在Dos界面

  • 進入.java文件所在目錄。
  • javac 命令編譯Print.java 文件,得到Print.class 文件。
  • java 命令執行.class文件,并傳入4個參數
  • 輸出java程序運行結果
dos

3、JDK的環境變量總結

在windows下:

  • 對于JDK:其實只需要設置PATH路徑即可,把xx/jdk/bin 目錄追加進去。

    其專用JRE(xx/jdk/jre)可以自動被xx/jdk/bin/ 中的命令調用。

    其公共JRE(xx/jre)自動被注冊到系統的注冊表當中,供其他應用程序調用。

  • 對于JRE:不需要設置PATH路徑,直接使用即可。

    因為JRE在安裝時就自動被注冊到系統的注冊表當中了。

  • 因此,公共JRE會被自動注冊到系統的注冊表之中,無需配置。

查看系統注冊表:

  • 1、Win + R,輸入regedit。
  • 2、在[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft] 下有Java相關的注冊表記錄。

小結論:

  • 不管是在windows下還是linux下,配置PATH變量的目的,都是為了在DOS界面/CMD界面可以直接調用xx/jdk/bin 目錄中的java命令,也就是為了在java編程時使用IDEA等工具能正確編譯、執行java程序。

    所以PATH變量的目的是用于java開發。

  • 當需要運行Tomcat服務器時,由于Tomcat需要JRE環境,所以它根據系統的環境變量來尋找JRE的位置。詳見Tomcat官方安裝、配置說明

    • 安裝JDK的情況下,設置JAVA_HOME 即可,Tomcat使用JAVA_HOME/jre 的JRE環境。或者設置JRE_HOME 來指定公共JRE的位置。
    • 只安裝JRE的情況下,設置JRE_HOME 為JRE所在目錄即可。

三、Linux下JDK環境變量的設置

一般來說,我們解壓JDK的tar包的位置可能有:

  • /usr/local/ 目錄,這里存放用戶的應用程序和文件,類似windows的program files 目錄。
  • /opt/ 目錄,這是給主機額外安裝軟件的目錄。

假設現在的JDK路徑為:/opt/java8/jdk1.8.0 目錄。

環境變量的配置:

1、所有用戶的shell都有權訪問的環境變量,這種做法在多人情況下可能帶來安全性問題。

1、打開配置文件:vim /etc/profile

2、輸入如下內容:

export JAVA_HOME=/opt/java8/jdk1.8.0  # Tomcat運行需要JRE環境
export PATH=$JAVA_HOME/bin:$PATH  # 開發java時需要

# export是把變量導出為全局變量

3、讀取、執行配置文件:source /etc/profile

4、查看JDK安裝:java -version

2、用戶級別的環境變量的控制,也是最靠譜的方法。

如果需要給某個用戶權限使用這些環境變量,只需要修改其個人用戶家目錄下的.bash_profile 文件就可以了。

1、打開用戶家目錄下的.bash_profile 文件:vim .bash_profile

2、輸入以下內容:

# 同上一致

3、重新登錄

JDK的卸載:

進入JDK的安裝目錄的_uninst 目錄,在shell終端執行命令:./uninstall.sh 即可。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容