從JDK的目錄結構想到的

這次我們來了解一些擴展知識:JDK的目錄結構。

目錄結構

我們打開JDK的安裝目錄,可以看到有這些目錄:

  • bin目錄:包含Java開發工具,例如編譯器javac.exe,解釋器java.exe,調試器jdb.exe等,在之前的安裝環節中,我們向Path環境變量添加%JAVA_HOME%\bin,目的就是讓系統能夠找到這個目錄中的各種開發工具。
  • conf目錄:包含開發和部署的配置文件,一般不需要修改。
  • include目錄:包含C語言頭文件,用於實現JVM等底層軟件。
  • jmods目錄:JDK 11採用了模塊化設計,以便縮小最終軟件的體積,方便定製,簡化管理。這個目錄下保存了核心模塊,也就是官方提供的各種類庫程序。該目錄下一共有71個模塊文件,具體內容可以參考官方文檔。在JDK8中,這些資源以jar包的形式存放,如lib目錄中的rt.jar等。
  • legal目錄:所使用的協議等法律文件。
  • lib目錄:包含Java運行環境的私有實現信息,不供外部使用,不能修改。src.zip文件也在該目錄中。

JRE目錄哪裏去了?

除了JDK,我們還曾經提到過JRE,JRE軟件提供Java程序的運行環境。對於開發人員來說,安裝JDK就可以了,因爲它已經包含JRE了。但是客戶只需要安裝JRE就足夠了。
JDK11是不包括JRE的。這是由於以往版本的JRE包含了所有的標準類庫等運行資源,導致JRE越來越龐大。但在大多數情況下,客戶端的Java程序不需要所有的資源。換言之,客戶機上安裝了很多不必要的數據。爲了改善這種情況,JDK使用了模塊化技術,允許開發人員根據實際情況定製JRE。

定製一個JRE

我們可以使用jlink工具來定製一個JRE。
打開命令提示符,輸入命令:jlink,可以看到以下幫助信息

C:\Users\jinzh>jlink
錯誤: 必須指定 --output
用法: jlink <選項> --module-path <模塊路徑> --add-modules <模塊>[,<模塊>...]
使用 --help 可列出可能的選項

當我們想在D盤下mycode目錄中生成一個JRE時,可以在命令提示符中輸入以下命令:

C:\Users\jinzh>cd d:\mycode
C:\Users\jinzh>d:
d:\mycode>jlink --module-path jmods --add-modules java.desktop --output jre
d:\mycode>dir
 驅動器 D 中的卷沒有標籤。
 卷的序列號是 9EA4-C9EA

 d:\mycode 的目錄

2020/01/14  23:17    <DIR>          .
2020/01/14  23:17    <DIR>          ..
2020/01/14  23:17    <DIR>          jre
               0 個文件              0 字節
               3 個目錄  3,915,841,536 可用字節

第一條命令cd d:\mycode表示要進入D盤的mycode目錄中,但命令提示符有個小毛病,如果我們要進入的目錄和當前位置在同一個分區中,會立刻進入;如果我們要進入的目錄和當前位置不在同一個分區中,則會停留在當前位置,直到我們輸入那個目錄所在分區的盤符爲止。
所以第二條命令d:,表示要切換到D盤中,此時我們就直接進入了D盤的mycode目錄。
第三條命令jlink --module-path jmods --add-modules java.desktop --output jre是關鍵。jlink命令用來創建新的JRE;--module-path參數用於指定模塊文件所在位置,jmods表示模塊文件所在的目錄名稱,需要注意的是,這個目錄的完整路徑其實是c:\Program Files\Java\jdk-11.0.5\jmods,由於這個目錄位於JDK11安裝目錄中,可以簡寫成jmods,如果該目錄不是在JDK安裝目錄中,或沒有配置環境變量,需要指定它的絕對路徑;--add-modules參數表示需要添加到JRE中的模塊,java.desktop就是本次使用的模塊,如果使用到了多個模塊,可以用英文逗號把它們分隔開;--output參數表示JRE的輸出目錄,jre爲保存JRE軟件的目錄名,也可以命令爲其它合法名稱。
該命令運行完畢後,就會在d:\mycode目錄中找到一個名爲jre的目錄,其中就包含了Java運行環境。我們可以把這個目錄拷貝到客戶的計算機上,然後配置一下環境變量。
配置環境變量的方法和安裝JDK時的配置方法相同,只不過需要新建一個環境變量名爲JRE_HOME,其值爲JRE所在的目錄路徑,然後爲Path環境變量增加值;%JRE_HOME%\bin

JDK 11和JDK 8的區別

JDK 11和JDK 8是目前僅有的兩個LTS版本,但兩者區別還是很大的。但這種區別主要反映在底層,對開發人員的使用習慣影響不大,Java的開發者們儘量在增加新功能、刪除舊代碼時做到了平滑過渡。我們仍然可以讓大部分JDK 8的代碼運行在JDK11上。但有時,我們還有些細節問題需要注意。
例如,JDK11中的lib目錄不再包含rt.jar或者tools.jar等jar文件,JDK11移除或者更新了一部分過時的標準類庫,同時標準庫也採用了模塊設計,這在進行代碼遷移時需要注意。
具體內容很多,有需要的朋友可以查看遷移說明
在絕大多數情況下,我們不需要過多關注兩者在使用上的區別——實際上,如果真的出現問題,在編譯過程中,會有相關提示的。我們沒有必要過分擔心兩者的區別。

最重要的一點:不要修改安裝包中的內容!!!

 

01

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章