Java 9將采用新的版本字符串格式
在現有的版本編碼格式使用了兩年之后,從Java 9開始,Java版本方案將根據業內軟件版本編碼的最佳實踐進行修改。使用或解析Java版本字符串的應用程序開發人員要注意了,因為這種變化可以會影響他們的應用程序。
正如 JEP 223 所闡述的那樣,當前的版本方案會跳過某些版本號,而且安全補丁版本和更新版本混在一起。社區認為,該方案產生的版本號含義模糊、不直觀。為了解決這個問題,Oracle引入了一種使用 語義版本編碼 的新版本方案,就是說,Java版本字符串將依次包含如下三個部分:主版本號、小(維護)版本號和安全版本號。長版本格式還將包含像構建版本號和可用性這樣的信息。
主版本號即我們通常所理解的Java版本,比如,Java 9的主版本是9。因此,按照Java的新版本發布計劃,主版本的變化只會兩年或三年發生一次。主版本的變化可能會包含破壞性變更,但這些變更至少會提前兩個主版本通知。
小版本號將包含非重要Bug修復、所支持API的維護發布以及增加內部組件,如新的服務提供程序、新的垃圾收集器,或者支持新的架構。同 更新補丁集 一樣,小版本有望每季度發布一次。
最后,安全版本將包含重要Bug修復。這些版本可能像重要補丁更新那樣根據計劃按季度發布,或者像 安全警報 那樣按需發布。
關于這點,有個值得注意的結論是,在認識到社區將當前版本號中的第二個數字作為事實上的主版本號,而開頭的1被理解為沒有意義之后,Oracle去掉了版本號開頭的“1”。這一變化可能會導致目前解析版本字符串而有假定版本號開頭為1或點的應用程序出現問題。例如,
System.getProperty("java.version").indexof('.');
上述獲取主版本的代碼會返回-1(尾部的0會從版本字符串中去掉,因此,9.0.0會簡單地表示成9)。
新方案將成為Java版本字符串的第三個標準。第一個始于 Java 1.3 。該方案相當簡單,使用第二個數字作為實際的主版本,第三個數字表明是一個安全修復(奇數)還是更新(偶數)。這種編碼系統存在缺陷,有時候會 迫使一些版本重新編碼 。
為了解決這個問題,Oracle引入了當前的版本系統。在當前的方案下,安全補丁仍然使用奇數,更新仍然使用偶數,雖然并不連續。更新總是20 的倍數,重要補丁更新的版本通過在最新的維護更新上增加5的倍數(為了保證版本號為奇數,必要的時候要加1)計算得出。這樣,如果維護版本號是20,那么按照計劃,后續安全版本將是25、31和35。版本號之間留出的數字將用于安全警報補丁的發布,這樣就不需要重新編碼其他計劃好的版本號。
新的版本編碼系統旨在采用一種能夠區分更新和安全補丁的方式,而且是一種識別要簡單許多的方式。