java9 揭秘 jlink_初试Java9
原標(biāo)題:初試Java9
Java 9 正式發(fā)布了
JDK 9
(http://openjdk.java.net/projects/jdk9/)
有不少重要或是有意思的新特性,這里簡(jiǎn)單介紹下我的了解與嘗試
拋磚引玉
下載
oracle 官網(wǎng)下載即可。
(http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.html)
安裝配置好之后, java -version 查看一下, 會(huì)看到
這里正有一個(gè)新特性[223], 新的版本字符串格式$MAJOR.$MINOR.$SECURITY.$PATCH.
值得一提的是,Java 9 以后,新的功能版本將每六個(gè)月更新一次, 每三年發(fā)布一次長(zhǎng)期支持. 此外,下個(gè)版本并不是 Java 10,而是Java 18.3,將于2018年3月推出。
新特性
jigsaw 模塊化
可以說Java 9 最重要,也是受到最多關(guān)注的功能就是模塊化了。模塊化經(jīng)歷了多次跳票,帶來的改變也是巨大的。
首先,模塊化是一種將程序?qū)崿F(xiàn)為多個(gè)獨(dú)立模塊的方式,有助于降低系統(tǒng)的復(fù)雜性以及低耦合。
為什么需要模塊化呢,jigsaw 的項(xiàng)目描述里寫的很清晰:
使開發(fā)人員更容易構(gòu)建和維護(hù)庫和大型應(yīng)用
提高安全性,可維護(hù)性
提高性能
可輕量級(jí)部署,以用于小型計(jì)算設(shè)備和密集云部署
相關(guān)介紹我們結(jié)合對(duì)應(yīng)的JEP來看:
[261] 模塊系統(tǒng)
實(shí)現(xiàn)了Java平臺(tái)模塊系統(tǒng),以及相關(guān)JDK的特定更改和增強(qiáng)。
[200] 模塊化JDK
Java9將JDK也分為一堆模塊,可以在編譯, 構(gòu)建及運(yùn)行時(shí)按照各種配置來組合。包括并不限于:
- 完整的JAVA SE平臺(tái),完整的JRE及JDK 的配置;
- 與在Java SE 8中定義過的"緊湊型配置"(Compact Profiles) 在內(nèi)容上基本一致的配置;
- 或者是 僅包含 應(yīng)用模塊, 外部庫 以及它們所需要模塊的自定義配置。
JDK 自身的模塊化,使得用戶可以根據(jù)需要選擇模塊。小型設(shè)備上可以不必要運(yùn)行完整的JDK,簡(jiǎn)單的應(yīng)用不再必須加載幾十兆的 rt.jar, 后端應(yīng)用也可以舍去并用不到的 Swing 等UI模塊, 這使JAVA可以不那么臃腫。
[201] 模塊化源代碼
將JDK源代碼重組為模塊, 增強(qiáng)構(gòu)建系統(tǒng)以編譯模塊
[220] 模塊化運(yùn)行時(shí)鏡像(Run-Time Images)
重組JDK和JRE運(yùn)行時(shí)鏡像以適應(yīng)模塊,并提高性能, 安全性以及可維護(hù)性。定義新的URI方案,用于命名存儲(chǔ)在運(yùn)行時(shí)鏡像中的模塊,類和資源,而不會(huì)透露鏡像的內(nèi)部結(jié)構(gòu)或格式。并根據(jù)需要修改現(xiàn)有規(guī)范以適應(yīng)這些變化。
[260] 封裝大多數(shù)內(nèi)部API
默認(rèn)封裝JDK大部分內(nèi)部API,使其在編譯時(shí)無法訪問。并為后面的發(fā)行版做準(zhǔn)備,使其在運(yùn)行時(shí)也無法訪問。同時(shí)確保關(guān)鍵的,被廣泛使用的內(nèi)部API不被封裝,以便它們?nèi)钥捎?#xff0c;直到大部分功能都能被替換為止。
這就涉及模塊化的另一個(gè)特點(diǎn)了, 強(qiáng)封裝。
[275] 模塊化Java應(yīng)用程序打包
[282] jlink
在編譯和運(yùn)行之間 引入了一個(gè)新的可選階段-鏈接,可以用 jlink 將一堆模塊及其依賴項(xiàng)組合并優(yōu)化到自定義運(yùn)行時(shí)鏡像中。
舉個(gè)例子,假如我們寫了一個(gè)簡(jiǎn)單的 helloWorld 的程序,只用到了 java.base 模塊。 就可以指定模塊打包:
output 里會(huì)得到一個(gè)完整可用的僅包含 java.base, 也就是基礎(chǔ)模塊的jre。同樣,我們也可以將自己的模塊一起打包。具體例子稍后給出。
Java 9 模塊之間的依賴關(guān)系圖
Java9 中,我們是通過 module-info.java 來定義并管理模塊,指定模塊之間的依賴關(guān)系的。默認(rèn)包含基礎(chǔ)模塊 java.base。 這里舉例 java.sql 模塊的 module-info.java文件:
很容易看到這里和依賴關(guān)系圖里是一致的,java.sql 直接依賴了 java.xml 與 java.logging 兩個(gè)模塊。
在該 module-info.java 文件中, module 后面的 "java.sql" 即定義的當(dāng)前模塊名。
requires ; 表示當(dāng)前模塊A 依賴于另一個(gè)模塊B 。 transitive 修飾符表示, 如果有模塊依賴于A,則隱含地依賴B。
exports ; 表示當(dāng)前模塊A 導(dǎo)出指定的 P包。 需要用到的模塊C 只需要 require A即可。也可以使用 (exports to ;) 來指定導(dǎo)出模塊,這樣的話對(duì)于C 以外的模塊來說,P 是不可見的。
可以看出,requires 是模塊級(jí)別, exports 則具體到包。編寫模塊的人可以很細(xì)致的管理以及限定真正想要導(dǎo)出的內(nèi)容。[260]里提到的正是這種情況, 像 sun.*, .internal. 等并不提倡使用, 就可以將這種API 指定只導(dǎo)出到用到的基礎(chǔ)模塊。
此外, 還支持服務(wù)提供者與使用者分離的機(jī)制。
uses ;
provides with , ...;
provides 提供服務(wù)接口的一個(gè)或多個(gè)實(shí)現(xiàn)類。 uses 指定服務(wù)接口, 然后當(dāng)前模塊就可以使用 ServiceLoader 類進(jìn)行加載。
參考官方文檔給出模塊化的一個(gè)簡(jiǎn)單示例。
首先代碼很簡(jiǎn)單,這里共4個(gè)文件, 兩個(gè)模塊, org.astro 與 com.greetings.
然后編譯及打包。
注: -p 同 --module-path, 是模塊路徑, 可以是包含模塊的一個(gè)或多個(gè)目錄。 -m 選項(xiàng)指定主模塊,斜杠之后的值是模塊中主類名。
jshell [222]
這是一個(gè)相當(dāng)受歡迎的新功能。命令行直接輸入 jshell 就可以開始使用,可以作為隨手運(yùn)行各種小代碼的工具, 非常方便。
tab 可以自動(dòng)補(bǔ)全,可以忽略句尾分號(hào)。輸入 /exit 或Ctrl+D 即可退出。
HTTP/2 Client [110]
定義了新的HTTP client API,支持 HTTP/2及WebSocket,可以替換掉原有的HttpURLConnection。 不過相關(guān)的 API 放在了 jdk.incubator.http 下,而不在默認(rèn)模塊里,也就是使用時(shí)需要在 module-info 里加上 requires jdk.incubator.httpclient;
Milling Project Coin [213] 一些小變化
@SafeArgs 注解之前只能用于static及final方法,現(xiàn)在也可用于私有實(shí)例方法。
try-with-resources 之前資源的聲明語句放在 try 關(guān)鍵字的括號(hào)里面,現(xiàn)在支持 effectively-final 變量。
只要編譯器能推斷出類型參數(shù), 匿名類允許使用<>
下劃線 _ 不能單獨(dú)用做標(biāo)識(shí)符。
interface 之前已經(jīng)支持添加默認(rèn)方法, 現(xiàn)在支持私有方法。
緊湊型字符串 [254]
String 采取更加節(jié)省空間的內(nèi)部表示,提高了空間效率,同時(shí)保持大多數(shù)情況下的性能,并完全兼容原有接口。
從 char[] 改為使用byte[],直接存放編碼。在構(gòu)造時(shí)設(shè)置 LATIN1 或者 UTF16。省內(nèi)存!
集合工廠方法[269]
Map/Set/List接口添加了簡(jiǎn)單初始化不可變集合的工廠方法, 可以直接寫作如 List.of(1, 2, 3),不再需要挨個(gè)元素來 add 了。返回的是 java.util.ImmutableCollections 下定義的嵌套類型的實(shí)例, 注意,是不可變的集合。
總而言之,JAVA 9 的新特性還有很多,比如: 更新了進(jìn)程相關(guān)接口(可以直接獲取 pid! )[102], 統(tǒng)一JVM日志[158],增強(qiáng)javadoc支持HTML5[224], javadoc 頁面終于加上了搜索條:) [225], 缺省GC 改為 G1 [248] , 實(shí)現(xiàn)SHA-3加密散列函數(shù)[287], 等等。
這里就不一一列舉了, 期待大家進(jìn)行更深入的研究與分享。
備注
文中提到的鏈接:
JDK 9 新特性
http://openjdk.java.net/projects/jdk9/
JDK 9 下載鏈接
http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.html
JDK 18.3 項(xiàng)目鏈接
http://openjdk.java.net/projects/jdk/18.3/
jigsaw 項(xiàng)目鏈接
http://openjdk.java.net/projects/jigsaw/
模塊依賴關(guān)系圖
https://bugs.openjdk.java.net/secure/attachment/72525/jdk.png
責(zé)任編輯:
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的java9 揭秘 jlink_初试Java9的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android scrollview居中
- 下一篇: 上古卷轴5json文件修改_【白夜谈】我