JDK環境解析,安裝和目的

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完全可以滿足需要,新版本沒有改革性的更新 (沒有改變版本的核心動力)。

以下摘抄自知乎
//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. 官網下載

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

下載的時候會有提示。

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

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

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

下載介面15

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

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

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

2.2.2. 網盤下載

鏈接://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中的各個文件的作用是什麼?