良葛格写的文章
Java依旧免费?
https://www.ithome.com.tw/voice/126265
Oracle JDK只能用于一般用途,不过,OpenJDK仍能允许商业使用。但是,虽然有免费、可商用的JDK建构版本,并不代表JDK的选择与维护是零成本
过去,被认为是免费的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的选择与日后维护等是零成本,更积极评估与选择变得必要,我建议以上提及的文件内容,你可以详细阅读,评估时容易有个出发点,不致于单纯落入免不免费这件事上!