發(fā)布于:2021-02-04 14:55:20
0
189
0
Java是一個超負荷的詞。首先,它是印尼一個島嶼的名字,也是咖啡的一個術語。然后我們有了Java,即計算平臺。即便如此,這個詞也有幾個含義:我們說的是Java編程語言語法,Java虛擬機還是Java開發(fā)工具包(JDK)?我們可以使用更多的方式來使用Java這個術語:card、embedded、Micro Edition和enterpriseedition(至少現在我們已經消除了Jakarta EE的歧義)。我肯定還有很多。
我拿著這個去哪?好吧,作為我在JDK遷移白皮書上所做工作的一部分,我正在編譯一個關于oraclejdk和zulujdk之間差異的精確列表,這是OpenJDK項目提供的源代碼的直接構建。由于我也是javase規(guī)范的專家組成員,這讓我想到了如何定義Java的哪些是和哪些不是一部分(這讓我想到了Java的真正含義)。
在去年jdk9發(fā)布的同時,Oracle發(fā)布了一系列關于JDK未來的開發(fā)和交付方式的公告。我以前寫過很多這方面的內容,但其中一部分是消除了oraclejdk和從OpenJDK源代碼構建的JDK之間的所有功能差異。這項工作將在今年晚些時候jdk11發(fā)布時完成,包括向OpenJDK項目添加組件以及從oraclejdk中刪除特性。
其中大部分已經被廣泛宣傳。以前的商業(yè)特性,如應用程序級數據共享、Java飛行記錄器和Java任務控制,都是由Oracle作為開放源代碼貢獻給OpenJDK項目的。JavaFX、瀏覽器插件和javawebstart等其他特性都將從jdk11的Oracle實現中刪除。
我想說的是,這是如何定義的。把它放到維恩圖中是很有用的,這樣可以更清楚地理解事情。
最小的部分是javase。這是JSR通過JCP定義的規(guī)范。如果您想創(chuàng)建一個可以稱為Java的東西,那么這是您需要提供的最低要求。這包括標準的庫集(所有java和javax包,以及一些組織.xml以及可以處理已定義字節(jié)碼集的JVM。JVM是根據功能來定義的,比如它需要一個垃圾收集器,而不是如何實現它。
在下一個層次,我們有OpenJDK。這是javase標準的參考實現,因此自然包含了其中的所有內容。它還包括javase沒有定義的東西。像JavaScript引擎Nashorn這樣的東西是OpenJDK的一部分,而不是javase(javase規(guī)范定義了腳本引擎的接口,但沒有定義任何這樣的引擎的實現)。
由于OpenJDK是javase的超集,OpenJDK項目提出了另一種方法來定義OpenJDK的新特性。這些被稱為JDK增強建議(JEPs)。雖然不是一個正式的標準過程,但這是一個開放的過程。任何擁有OpenJDK提交者身份的人都可以自由提交JEP。當然,因為我們要處理的是核心Java平臺,幾乎有數百萬的開發(fā)人員在使用它,所以作為JEP提交一個有趣的想法并不能讓它被接受(事實上,遠不是這樣)。到目前為止,只有一個改變API的特性JEP被Oracle以外的人成功提交、接受和發(fā)布。那是杰普285,我們在阿祖爾的提示。這是向Thread類添加了一個方法,在許多實現中,這個方法什么也不做。我們需要付出大量的努力和審查,才能將其應用到OpenJDK中。同樣,考慮到Java的廣泛使用,這是非常令人放心的。
還有一些非Oracle JEP用于JDK的不同端口(SAP的JEP 175和JEP 294以及Red Hat的JEP 237),還有一個將包含在JDK 11中(Red Hat的Epsilon垃圾收集器JEP 318)。
有趣的是,JEP這個詞最近有點用詞不當。兩個jep 313和320描述了特征的刪除。我想你可以通過移除一些東西來增強某些東西,但這似乎有點違反直覺。
最后,我們有了oraclejdk。因為這是Oracle的OpenJDK的二進制發(fā)行版,所以他們可以自由地添加任何他們想增加價值的特性。JavaFX就是一個很好的例子。JavaFX有自己的開源項目(OpenJFX),它獨立于OpenJDK。JavaFX從未集成到javase標準中(與AWT和Swing不同)。刪除這樣的功能完全由甲骨文自行決定,但他們在通過各種博客文章(稍后會有更多內容)宣傳這樣的內容方面做得相當不錯。
讓我們回到我之前所說的關于研究OpenJDK和oraclejdk之間的差異。作為本文的一部分,我對jdk10和jdk11中的模塊列表進行了直接的區(qū)分。原來有31個模塊被移除,兩個模塊被添加。
首先,是刪除java.se.ee文件聚合器模塊。本文引用了六個模塊,它們是JavaSE的一部分,因此已從JavaSE11規(guī)范中刪除。聚合器模塊和兩個相關的特定于jdk的模塊不是javase規(guī)范的一部分。
java.se.ee
java.activation
java.corba
java.transaction
java.xml.bind
java.xml.ws.annotation
java.xml.ws
jdk.xml.bind(非Java SE)
jdk.xml.ws(非Java SE)
HTTP/2孵化器模塊(在jdk9中引入)已經被刪除,并替換為現在是javase標準的一部分。這在jep110、jep321和javase11規(guī)范中有描述。
jdk.incubator.httpclient客戶端替換為java.net.http
JavaFX的模塊。正如我所提到的,這些模塊只包含在oraclejdk中,盡管JavaFX是更廣泛的OpenJDK項目的一部分。他們被撤職的消息在這里宣布了。
javafx.base
javafx.controls
javafx.deploy
javafx.fxml
javafx.graphics
javafx.media
javafx.swing
javafx.web
對于相關的Java packager,有兩個特定于JDK的模塊。
jdk.packager
jdk.packager.services
瀏覽器插件和JavaWebStart模塊。這些特性的刪除在這里和這里的模塊一起被公布,這些模塊主要是針對Oracle的,但是還有java.jnlp文件模塊。
這個模塊讓我很困惑。根據JDK文檔,所有Java SE模塊的名稱都以java開頭,但是似乎不是所有以java開頭的模塊都在Java SE中,因為java.jnlp不是標準的一部分。但是,JCP將其定義為 JSR 56。這樣,根據 描述模塊化JDK的JEP 200,模塊名稱以java開頭。JSR 56的參考實現從未作為開源發(fā)布,因此它只是Oracle JDK的一部分。
java.jnlp
jdk.javaws
jdk.plugin
jdk.plugin.server
jdk.deploy
jdk.deploy.controlpanel
然后是其他模塊。有兩個明顯是甲骨文特有的,因為它包含在名稱中。似乎因為它們是桌面和網絡模塊,所以它們的前綴是oracle而不是jdk,以防止混淆。
oracle.desktop(Oracle AWT實用程序)
oracle.net(SDP和NIO Oracle的補充)
最后,我們還有另外三個特定于Oracle的模塊。在這些情況下,除了JDK 10的along文檔聲明這些特性被棄用之外,其他地方似乎都沒有宣布刪除這些特性。我有點驚訝的是,SNMP支持的刪除沒有在某處宣布(如果我錯了,請糾正我,但是標準搜索沒有顯示任何內容)。
jdk.management.resource(資源管理)
jdk.management.cmm(協同內存管理)
jdk.snmp(SNMP支持)
至少從jdk11開始,Venn圖縮小到只有兩個圓:OpenJDK和javase。
我計劃在以后的博客文章中更詳細地討論JCP和OpenJDK之間的關系以及Java特性是如何被添加或刪除的。
作者介紹