JDK環境解析,安裝和目的

咕咕狐發表於2021-02-20

1. JDK環境解析

本篇將會介紹JDK的構成以及各部分的功能。

JDK = JRE + 開發工具。
 
JRE = JVM + 類庫。

JDK粗略

1.1 JVM

Java Virtual Machine (Java 虛擬機器), 是一個虛構出來的計算機,能模擬計算機功能。

JVM遮蔽了具體作業系統平臺的資訊,
這就是Java的能夠“一次編譯,到處執行”的原因。
 
JVM 將位元組碼解析為機器碼。

1.2 JRE

Java Runtime Environment java 執行時環境,主要包括JVM和Java程式所需的核心類庫lib等。

JRE = JVM + 類庫。

在JDK的安裝目錄裡可以找到JRE目錄,裡面有兩個資料夾bin和lib。

bin: binary 二進位制檔案,
存放的是除錯後可執行的檔案。
 
lib: library 類庫,
存放需要引用的類庫 即 jar包。

因為在解釋.class檔案的時候 JVM 需呼叫類庫 lib (JRE裡有執行.class檔案的java.exe),所以光有JVM不能執行.class檔案。

可以認為,
 
bin裡的是JVM。
 
lib裡的是JVM工作所需要的類庫。
 
JVM和 lib和起來就稱為JRE。
 
可以理解成虛擬機器平臺+虛擬機器本體(JVM)的關係。

JRE給普通使用者提供了執行java檔案的環境。

1.3 JDK

Java Development Kit java 開發工具,包括了JRE, Java開發工具(如編譯器和偵錯程式)和Java基礎的類庫。

JDK = JRE + 開發工具。

在JDK安裝目錄下面有六個資料夾、一些宣告檔案、一個src.zip壓縮檔案。主要是bin、include、lib、 jre這四個資料夾起作用。

bin: 存放各種工具命令(如: 編譯器 javac.exe)。
 
include:  java和JVM互動用的標頭檔案
 
lib:  JDK工具命令的實際執行程式 (最終呼叫)
 
jre:  JRE (java執行環境)
 
db:  安裝JavaDB的路徑
 
demo:  存放JDK提供的演示程式碼
 
sample:  JDK提供的一些簡單示例程式碼
 
src.zip:  Java所有核心類庫的原始碼

總的來說JDK是用於java程式的開發, 而JRE則是隻能執行.class檔案而沒有編譯的功能。

JDK詳細構成
常見使用流程:

我們利用 JDK (呼叫 Java API 開發工具)編寫出 Java 原始碼,儲存於 .java 檔案中。
 
JDK 中的編譯器 javac 將 Java 原始碼編譯成 Java 位元組碼,儲存於 .class 檔案中。
 
JRE 載入、驗證、執行 Java 位元組碼。
 
JVM 將位元組碼解析為機器碼並對映到 CPU 指令集或 OS 的系統呼叫。

強調:

JDK有 javac.exe , JRE沒有。
(javac指令是用來將java檔案編譯成class檔案的,這是開發者需要的, 而使用者是不需要的。)
 
JDK是開發環境,JRE是執行環境。

 
JVM 本身不能執行 .class 檔案,需要 JRE 下的 lib 類庫的支援。

2. JDK安裝

2.1 為什麼使用JDK8

2.1.1 更新

  • Oracle平均每隔6個月就釋出一個新版本,導致很多人對上個版本都沒精通,下個版本就已經發布了。

2.1.2 穩定

  • 軟體需要的就是穩定,對於不是人人都使用最新版的情況。大環境傾向於使用JDK8。(新版本可以相容舊版本,而舊版本不能執行新版本)
     
  • 新版本不穩定,對於出現的每一個小bug都會消耗很多精力去解決。
     
  • 對於已完成的專案軟體來說,更新極有可能導致很多未知的執行時錯誤和編譯器錯誤。

2.1.3 需求

  • JDK8使用時間已久,大大小小的特性,bug 都摸清楚了,用起來更方便。
     
  • 如果出現了一些不可修復問題,而如果能夠回退版本就能解決的話,那麼很多時候的選擇是回退版本。
     
  • JDK8完全可以滿足需要,新版本沒有改革性的更新 (沒有改變版本的核心動力)。

以下摘抄自知乎
https://zhuanlan.zhihu.com/p/139274956

在Java8之前,使用者接受更高版本的Java的過程非常緩慢,想要跟上每六個月就要升級的步伐,實在是太難了。
 
對於企業來說,這種升級分分鐘會帶來相容性的致命問題,風險也是非常大的,尤其面對龐大而又複雜專案。
 
而且JDK是個非常核心的基礎設施,除了安全漏洞,基本上是不會再去動生產環境JDK了,而且出了安全事故誰也承擔不了這個責任。
 
在這麼多的版本中,只有Java8、Java11和未來的Java17是長期支援版本(LTS),Oracle會支援3年,其他的只會支援6個月,新版本一出,就放棄老版本的技術支援,這也是很少有人使用9~14的版本的原因。
 
那程式設計師們還有必要學習Java的新版本嗎?
 
我認為是有必要的。
 
從技術來看:Java小版本更新基本上都是修復各種漏洞和bug,不會去改變現有的JDK,JDK其實都差不多,我們只需要知道它新增了什麼功能而已,從這一點來看其實也增加不了很多的學習成本。
 
當Java大版本的更新,比如JDK7->JDK8,會增加一些新特性,花幾個小時看看realse
note就可以完成學習了,同樣花不了程式設計師們的很多時間。
 
從個人來看:雖然很多公司還在用JDK6-7-8,但是我們更應該關注的是自身的知識基礎和學習能力,不要因為現在公司的Java技術停留在某個版本上面而放棄學習,我們可以不為企業更新Java版本,但我們要為自己的知識深度與廣度學習更多的Java知識。
如果你只會Java1.7,那麼你的求職範圍只能在使用Java1.7的公司中,一個用得上Java8、11、12的公司為什麼要招一個連Java8都不會的人呢?
 
除了留意版本更新,程式設計師們同時要留意基於Java的一些流行框架和新技術,比如近幾年興起的SpringBoot、SpringCloud等。
 
一句話就可以概括:企業升不升級是他的事,你學不學是你的事。

2.2 安裝JDK

本篇提供官網渠道和網盤下載。各位按照自己需求自行選擇。

2.2.1. 官網下載

下載是要賬號的,如果沒有的話可以註冊一個。

下載的時候會有提示。

首頁: https://www.oracle.com/index.html

ORACLE首頁
選擇JDK版本的介面:
https://www.oracle.com/java/technologies/javase-downloads.html

當前看到的是JDK15,把介面往下翻,

下載介面15

一直翻到JDK8 ,選擇JDK下載。

JDK8
這裡選自己需要的版本。我下的是 windows-x64。

JDK對應的作業系統
同意彈出的提示後下載。
下載確認

2.2.2. 網盤下載

連結:https://pan.baidu.com/s/1LgFhwr0-ur_sZEJZCrLh-Q
提取碼:m6bg

安裝JDK的時候根據提示進行下一步就好了,安裝位置建議放在C盤以外的地址。

更改地址

3. java環境配置

3.1 配置環境變數

3.1.1 配置JAVA_HOME

右擊此電腦/我的電腦->屬性->高階->環境變數->系統變數->新建

環境變數

變數名: JAVA_HOME

變數值: JDK的安裝地址

在這裡插入圖片描述
輸入完成之後點確認

3.1.2. 配置PATH

找到path,雙擊或者點編輯->新建

在這裡插入圖片描述

輸入: %JAVA_HOME%\bin

點確定儲存。

3.1.3 配置CLASSPATH

這一步瞭解就好,原因在後面會講到。

變數名: CLASSPATH

變數值: .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

CLASSPATH
點確定儲存變數

3.2. 測試環境變數

快捷鍵 “win + R”   ->  輸入cmd  ->  確定

cmd

在命令視窗輸入: java -version
-> 按回車

java-version
配置成功。

3.3 編寫第一個java程式

建立一個字尾為.java的檔案(儘量在純英文資料夾下),
 
如果不會的話可以 檢視->勾上檔案擴充名

改字尾名1

新建文字文件 -> 右鍵重新命名

改字尾名2

有提示直接確認就可以了。

改字尾名3

建立成功。
改字尾名4
在裡面寫入測試程式碼。

public class Test{ //class後面的單詞要與檔名保持一致

  public static void main(String args[]){

    System.out.println("Hello world!");
    } }

儲存。
再次開啟命令視窗(“ win + R ”   ->  輸入cmd  ->  確定)。

在命令視窗輸入 D: //檔案所在的硬碟位置
->回車

切碟符

在命令視窗輸入: cd+空格+檔案位置
 
不知道 .java 檔案的地址,可以直接點檔案管理器上方的資料夾圖示即可顯示路徑
然後複製

複製檔案位置

在命令視窗輸入:cd D:\dd\test   //檔案位置  
->回車
在命令視窗輸入:javac Test.java //編譯檔案
->回車

執行成功之後, 在相同的目錄下會有一個Test.class檔案,
 
這是編譯之後給計算機看的檔案。

編譯

在命令視窗輸入:		java HelloWorld
->回車
命令視窗會列印/顯示:	Hello World!

編碼過程
編碼完成。

4. 配置環境變數的目的

配置環境變數的目的很簡單:為了在命令列視窗(dos)下編譯和執行Java程式。

由於java開發命令不屬於Windows本身命令,所以需要進行路徑配置才可以使用。

4.1 配置JAVA_HOME環境變數目的

JAVA_HOME環境變數指向 JDK 的安裝目錄。

  • 方便引用->把路徑配置在 JAVA_HOME 裡,PATH 可以直接引用 %JAVA_HOME% 。

  • 歸一原則->當JDK路徑發生改變時, 僅需更改JAVA_HOME的變數值。

  • 約定協議->一些常用的 java開發軟體 (比如Eclipse) 都是預設通過搜尋 JAVA_HOME 變數來找到並使用JDK的。

4.2 配置PATH環境變數目的

現在知道了.java 檔案需要先轉換成 .class 檔案才能被電腦識別,

也就是 原始檔 -> 二進位制位元組碼,

而我們在命令視窗用到的java命令,如

javac 把.java檔案編譯成.class檔案。
 
java 執行.class檔案。

  • 這些命令都是通過我們配置的PATH環境變數找到相應的 (bin資料夾中)
    java.exe和javac.exe檔案,計算機才能正確識別並執行我們輸入的java命令。

配置完成之後,作業系統就可以呼叫 javac.exe 和 bin 資料夾下其它的可執行檔案,包括執行Java程式的java.exe。
 
path是Windows查詢.exe檔案的路徑

4.3 配置CLASSPATH環境變數目的

在java開發過程中,我們會用到很多自帶的標準類庫,所以告訴計算機如何找到它們是必須的。

將Java源程式編譯成.class檔案之後,才可以執行Java程式。
 
而執行Java程式需要讓虛擬機器(JVM)知道.class檔案的位置並導到記憶體

  • JVM就是通過CLASSPATH來尋找類的。

變數的值: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
 
“.”     當前目錄
 
dt.jar    執行環境的類庫
 
tools.jar   工具類庫

沒有以上兩個類庫的支援,很多Java程式就無法執行。

啟動jvm的時候,jvm會根據classpath環境變數所儲存的路徑資訊下去尋找對應的class檔案。而自JDK1.5以後,JRE能自動搜尋目錄下類檔案,並且載入dt.jar和tool.jar的類。

CLASSPATH 是jvm查詢.class檔案的路徑。

現在,很多IDE(整合開發環境)不需要配置環境變數,也能正確編譯和執行Java程式。

我們只需要在IDE (如: IDEA) 當中相關的配置選單下,正確的指定出JDK的安裝路徑就可以了。

總結:

JAVA_HOME 配置提供JDK的按照目錄。
 
PATH 配置提供的是java的編譯環境。
 
CLASSPATH 配置提供的是java的執行環境。

有什麼建議都歡迎發到評論區討論,每一條留言我都會看的。

參考資料:

  1. 都2020年了,我還在用Java8!

  2. 為什麼很多公司選擇不升級JDK版本,仍然使用JDK8?

  3. java變數設定_java環境變數的詳細配置

  4. 淺談JDK、JRE、JVM區別與聯絡

  5. Java的.lib庫、.jar包、.Class檔案? JDK中的各個檔案的作用是什麼?

相關文章