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