Oracle对J2SE收费是怎么回事,以及如何继续免费使用Java

235 阅读4分钟

最近看到不少文章说了有关与Oracle调整了J2SE支持的收费模式的事情,所以我们也就这个话题来详细的说一下。

Oracle如何对Java收费

相信多数人都认为,Java是开源且免费的,使用Java怎么会被收费呢?这首先要从Java的License说起,我们知道Oracle收购了Sun Microsystems,于是也拥有了Java,所以Java的License也是由Oracle指定的。不过Java的License并不是这么简单,甚至对于Java的不同部分来说,授权的License也是不同的。下面我们来稍微具体的简单说下:

  • 首先是Java的源代码,这个是基于GPLv2 License(注意这个License还包括了对于Classpath的Exception)来授权的,所以原则上来说Java的源代码本身就是正经的开源且免费的。
  • 代码免费,但是编译好的J2SE SDK就不一样了,毕竟大家其实主要都是在使用编译好的。那么Oracle收费的地方也主要是是针对编译好的Java SDK及其扩展和支持服务的。
    • Oracle大概是从Java 17的某个版本开始,Oracle开始以Oracle No-Fee Terms and Conditions (NFTC)对J2SE SDK进行免费试用的授权,在NFTC这个License中,约定" internally use the unmodified Programs for the purposes of developing, testing, prototyping and demonstrating your applications, and running the Program for Your own personal use or internal business operations"。所以即使对于商业使用来说,Oracle J2SE SDK不仅对开发、调试、原型建模和demo都是免费,不对外的内部系统也是免费的。
    • 但是需要服务外部用户的系统(比如公开的网络服务),NFTC就不适用了,使用Oracle J2SE SDK的授权就必须要购买Oracle Java SE Universal Subscription,而这个东西,按照Oracle的新收费模式,竟然是按照企业的人数来收费的,比如一个企业有1000个开发人员,但是有29000个销售和其他支持人员,那么这个授权依然需要按照30000人来购买。这样的话是不是感觉非常亏了,这也就是大家觉得这个收费模式会严重提高Oracle Java J2SE的收费成本的地方。
    • Oracle对于不同版本的Java的授权在细节上是有很多区别的,尤其是对Java 17之前的版本,具体的可以参考Oracle Java SE Licensing FAQ 中的这个表格

如何继续免费使用Java

上面已经提到了Oracle J2SE SDK本身针对相当多的场景提供了免费的授权,当然这样的使用并不彻底,一不小心就会掉到沟里。在Oracle J2SE SDK之外,还是有很多免费的binary JDK发布的,使用这些版本的JDK,就不需要担心Oracle的收费问题了。

首先是Open JDK,这个应该也是大家最为常用的免费版本了,Open JDK和Oracle J2SE SDK相比,最大的缺点就是更新慢,可能Oracle J2SE SDK的版本已经更新好久了,Open JDK的版本依然原地躺平,而且对一些早期的版本来说Open JDK就已经放弃维护了。所以Open JDK在安全性上时严重滞后的,一些对于一些有人惦记的服务来说,比如银行等,使用Open JDK还是非常危险的。

那么,除了Open JDK之外,其实还是有很多组织和公司提供了自己build的JDK版本的,比如aws的Corretto,Eclipse基金会的Adoptium,甚至阿里也有自己的build版本Dragonwell(不知道中文名是不是“龙井”),可以在whichjdk.com/查看JDK的各种build版本。

不同的build版本,其实提供了很多Open JDK之外的优势。比如上面提到的Adoptium,在Java的更新发布之后就会及时的发布新的build;一些公司对专门针对aarch64等架构提供了build版本,比如aws的Corretto;另外,一些公司针对LTS的版本支持时间也延长了。

如何管理JDK的版本

在上面看到了JDK如此许多的版本,如何管理和安装也会是一个问题,那么这里再介绍一下sdkman,一个JDK版本(也包括scala, groovy等)的管理工具。可以这样理解sdkman,可以像nvm一样来管理nodejs的各种版本,或者像pyenv一样来管理Python的版本。

可以直接通过

curl -s "https://get.sdkman.io" | bash

来安装sdkman,然后就可以任意的管理多个Java环境了。比如

sdkman list  # 获取可以安装的版本列表
sdkman install java 17.0.6-amzn  # 安装java某个版本
sdkman use java 17.0.6-amzn  # 使用java的某个版本
sdkman default java 17.0.6-amzn  # 设置java的某个版本为默认

具体的就可以去参考sdkman的帮助文档了。

最后说一下,如果你的产品或者服务是和Java深度绑定的,那么Oracle的Java SE Universal Subscription还是相当必要的,毕竟Oracle是Java的拥有者和最主要的维护者。