過去,被認為是免費的Java而言,在傳出有企業遭到追討授權費的新聞後,Java不再免費的話題,就傳遍了大街小巷。

現在,Java 11都釋出了,若還只是在討論免不免費這件事,只是把問題看得太簡單了!

Java釋出版本與頻率

Java在釋出的版本與頻率上,過去以來,曾有幾次重大變更。

若干歷史在先前專欄〈想跳舞的Java〉曾經提過,就結論而言,JDK8及更早版本,安全性修補的釋出會是基於5的倍數,遇偶數加一,例如8u5、8u11、8u25等,8u31,特性(feature)釋出版本會是20的倍數,像是8u20、8u40、8u60等,會包含先前的安全性修補,以及不影響規格書的特性,像是JVM的效能增強或工具更新等,自Java 9開始,安全性修補版本改為每三個月釋出一次,而特性版本改為每六個月釋出一次,在這樣的頻率下,9.0.1、10.0.1中,1代表著安全修補,而9、10這開頭的數字,代著特性版本,更新內容可以是包含JVM、語言、程式庫等各種更新,而不是像Java 7到Java 8這樣,數字代表著重大釋出(major release)。

Java 9、10都是短期支援版本,在下個小版本釋出之後,上個版本就不再維護,使用者要趕快更換至新版本。

不過,就企業而言,安全性的修補通常是重大考量,因而更需要留意的是長期支援版本(Long-Term-Support, LTS),例如,Java 8就是個長期支援版本,Oracle預計支援至2020年,〈Oracle Java SE Support Roadmap〉(https://goo.gl/7Civd5)指出,自Java 8之後,預計每三年釋出一個LTS,最新出爐的Java 11,就是長期支援版本。

Stephen Colebourne在〈Java release chains〉(https://goo.gl/2Tex7a)建議,可以將LTS視為如同過去版本的重大釋出,因而就企業而言,Java 8是個可考慮的版本(他建議至少是8u40之後的版本),接下來則是 Java 11,若是Oracle JDK11,目前預計支援至2026年。

Java不再免費?

前陣子有段時間,傳言有企業接到Oracle通知,將Java運用在商業或特定用途,必須繳交授權費,因而傳出許多Java不再免費的消息,甚至與Oracle控告Google的官司新聞混淆在一起。

而Oracle與Google之所以打官司,問題就在於,Oracle聲稱Google的Android系統抄用了Java的API,而這與Java運用在商業或特定用途必須繳交授權費,其實是不相干的兩回事。

「Java不再免費」是個籠統的說法,被稱為不再免費的對象,指的其實是JDK/JRE。

過去從Sun下載JDK使用,沒聽過被要求授權費的事情。因為,從Sun/Oracle下載的JDK(不包含JDK11),必須遵守BCL(Binary Code License )規範,而當時Sun BCL也提到,從Sun下載的JDK在用於桌面個人電腦時,是免費的(no-fee);到了後來,在Oracle BCL中則提出不同規範,要求從Oracle下載的JDK,只能用於一般用途(general purpose, general use, general computing)。

然而,到底什麼是一般用途呢?就目前我所搜集到的資訊來說,看不到有任何來源給出了清楚的界線!不過,後來在〈Oracle Java SE 8 Release Updates〉(https://goo.gl/CNqJp2)中指出,Oracle JDK8的公開更新自2019年1月之後,在沒有取得商業授權下,非個人用途是不得採用的。

就LTS來說,剛釋出的Oracle JDK11在〈Oracle JDK License〉(https://goo.gl/4vFoAZ)也明確寫著,除了開發、測試、原型、應用程式展示外,不可將之用於任何資料處理(data processing)、商業、產品、內部企業等目的。

儘管BCL對於什麼是一般用途,一直沒有定義清楚的畫分界線,然而,就Oracle JDK8、Oracle JDK11等LTS版本來說,商務上的應用,確實不再是免費的!

基於OpenJDK的建構版本

若採用重要的LTS,Oracle JDK的用戶必須取得商用授權,才能取得安全修補,不過,對OpenJDK來說並非如此!2006年JavaOne大會上,Sun宣告Java開放原始碼,2009年4月15日正式發布OpenJDK,而OpenJDK7的授權為GPLv2 + Classpath Exception(https://goo.gl/eYsupP),基本上,這裡允許商業上的使用。

舉例來說,OpenJDK7當中,有許多程式碼因程式碼授權的衝突而必須拿掉,使得原始的OpenJDK7是不完整的,所以,Red Hat於2007年發起了IcedTea計畫,致力於修補OpenJDK7,使之完備,並通過了JCK相容測試。

至於OpenJDK6,則是OpenJDK7的分支,過去Oracle JDK6結束支援時,Red Hat於2013年3月宣布,他們持有OpenJDK6領導權,而能持續對OpenJDK6臭蟲與安全問題進行修補(但該公司在2016年12月已經終止OpenJDK6的支援)。

在〈Oracle JDK Releases for Java 11 and Later〉(https://goo.gl/uSV34X)提到,從Java 11開始,除了必須取得商用授權的Oracle JDK之外,Oracle也提供OpenJDK的建構版本,其中也包含了過去版本中的一些商用特性(過去幾年Oracle陸續貢獻給OpenJDK社群)。

因此,就功能而言,從JDK11開始,Oracle JDK及OpenJDK基本上是相同的(文中也提到了一些差異性,像是javafx等模組)。

若是使用Oracle建構的OpenJDK,未來無法從Oracle取得安全修補,不過,安全修補會回饋至OpenJDK的原始碼庫,而除了自行建構以便跟上修補之外,也有其他預建構好的OpenJDK版本,像是〈Time to look beyond Oracle's JDK〉(https://goo.gl/ZPgvD4)提到的AdoptOpenJDK等。

單就免費的考量來說,AdoptOpenJDK就提供了OpenJDK8到10,在Java 11正式釋出後不久,也會有OpenJDK11的版本,就LTS來說,基本上,不用擔心沒有免費的安全修補可用。

若需要商務上的付費服務,〈Time to look beyond Oracle's JDK〉也提到,如Azul Zulu等公司,在考量與作業系統整合度時,Red Hat也提供內含OpenJDK的建構版本。

並非只是免費與否

就簡單的結論來說,Java還是有免費版本的JDK,問題在於選擇使用哪個JDK。然而,就算有AdoptOpenJDK等組織或公司,提供現成OpenJDK建構,但是,更多樣的OpenJDK建構來源,加上六個月的釋出模型,以及三年一次的LTS版本,也代表著更多必須考量的問題。

就穩定的安全修補而言,著重在三年一次的LTS是個選擇,然而,不同的OpenJDK建構版本,對LTS的支援期限也不同。另外,也必須同時考量程式庫要求的最低版本等問題,關於這部份,可參考〈如何面對新的Java Release Model〉(https://goo.gl/F5UoPF)。

因而就算有免費可商用的JDK建構版本,也並不代表JDK的選擇與日後維護等是零成本,更積極評估與選擇變得必要,我建議以上提及的文件內容,你可以詳細閱讀,評估時容易有個出發點,不致於單純落入免不免費這件事上!

作者簡介


Advertisement

更多 iThome相關內容