Java 要收费 ?! 是时候使用 OpenJDK 了

Java 要收费 ?! 是时候使用 OpenJDK 了
Java 要收费 ?! 是时候使用 OpenJDK 了

OpenJDK

如果你还在使用 Oracle JDK,请赶快换到 OpenJDK 吧,甲骨文已经开始查授权了。

What ?!

基本上,除非你开发的应用程序有特定的需求,非得使用 Oracle JDK 提供的功能,才需要付费去使用它,否则请改用 OpenJDK。

甲骨文收购升阳之后,开发者从 2016 年开始必须明确地分辨使用的是 Oracle JDK 或 OpenJDK,不然可能会收到甲骨文的付款通知 :money_with_wings:。OpenJDK 是针对 Java SE 实作的开源软件,不同的公司即组织均有实作,甲骨文本身也有提供,还有 IBM、RedHat、微软等。

Java 是个编程语言,本身没有收不收费的问题,是开发工具 (JDK) 及运行环境 (JRE) 才有收费、免费使用的问题。当你使用其他 JVM 语言开发时,例如 Kotlin,如果你使用的是 Oracle JDK ,仍旧是需要付费的,改用 OpenJDK 则没有这个问题,所以收费的问题不是出在编程语言上。另外,JRE 是包含在 JDK 里面的,它是个运行环境,可以让 JDK 编译而成的比特码在其中运行,OpenJDK 中也有包含其实作的 JRE。

以前的 Java 教学书籍上,第一章就会教你去如下的网站下载 JDK (Java SE):

Java 要收费 ?! 是时候使用 OpenJDK 了
Java 要收费 ?! 是时候使用 OpenJDK 了

从现在开始请别这么做,网站上已经好心的提供你一个免费版本的 JDK 的链接,这是由 Oracle 维护的 OpenJDK 版本,绝大多数的功能都和 Oracle JDK (Java SE) 相同,只缺少那些需要付费的特定项目。

Android 从 N (7.0) 开始已经转移到 OpenJDK

JDK 版本更新历史

版本 发布年份 事件
JDK Beta 1995 年 首次发布
JDK 1.0 1996 年 初发布时命名为 Oak
1.0.2 真正稳定版才被称作 Java
JDK 1.1 1997 年
J2SE 1.2 1998 年 版本重命名
在 J2SE 5.0 发布时,被重命名为 Java 2
而版本名称为 J2SE 用于区别 J2EE, J2ME
J2SE 1.3 2000 年
J2SE 1.4 2002 年
J2SE 5.0 2004 年 代号为 Tiger
版号改变,内部版号 (开发者) 为 1.5 外部则为 5.0
Java SE 6 2006 年 版本重命名, J2SE 改为 Java SE,并且去掉 .0
内部版号仍为 1.6.0
Java SE 7 2011 年 距上个版本约 5 年
2009 年 4 月 20 日,甲骨文收购升阳
Java SE 8 (LTS) 2014 年 第一个长期支持版本
社区版支持到 2019 年 1 月
非社区版支持到 2020 年 12 月
2016 年甲骨文开始对商业授权收费
Java SE 9 2017 年 支持到 2018 年 3 月
距上个版本约 3 年,但是约 1 年就终止了
Java SE 10 2018 年 支持到 2018 年 9 月
发布不到一年即终止
Java SE 11 (LTS) 2018 年 2018 年 9 月 25 日发布,为长期支持版本

参考数据: https://zh.wikipedia.org/wiki/Java%E7%89%88%E6%9C%AC%E6%AD%B7%E5%8F%B2

安装 OpenJDK

我们现在该怎么做?如前面所说,OpenJDK 只是一个概念,有许多公司或组织都有实作它们自己版本的 OpenJDK,最简单方便的是使用甲骨文的 OpenJDK,它的网址是 https://openjdk.java.net/https://jdk.java.net/ ,但是请注意它的下载说明文本:

Java 要收费 ?! 是时候使用 OpenJDK 了
Java 要收费 ?! 是时候使用 OpenJDK 了

请注意你前往的是 Oracle 的 OpenJDK,而不是 Oracle 的 JDK (这个指的是付费的 Java SE)。

要找到安装档可以直接在网址后面接版本,例如: https://jdk.java.net/11 或目前较多人用的 https://jdk.java.net/8 ;但很不幸地,目前 Oracle 的 OpenJDK 没有提供 8 版给 Mac 或 Windows 等平台,你下载的仍是 Oracle 的 JDK (在 Linux 上可以安装 8 版的 JRE),所以下载前你会看到网站要求你接受授权 (Accept License Agreement) ‍♂️,目前看来,Oracle 的 OpenJDK 你只能用 10 或 11 版。

怎么那么烦 ‍♂️

因为大家工作用的电脑可能是 Windows 、Mac 或 Linux,所以我想找一个能同时提供这三个平台的 OpenJDK 实作,于是找到了 AdoptOpenJDK ,这是一个由 Java 用户群组所组成的社区,致力于倡导 OpenJDK;它提供的支持平台最全面,JDK 版本也涵盖 8 到 11 最齐全。

你可以到 这页 找到自己想要的 OpenJDK 版本及支持的平台,我概略说明一下各平台的安装流程,基本上都差不多,首先就是下载 OpenJDK,解压缩后,将子目录 bin 的完整路径加入环境变量即可。

Windows 的安装

  1. 下载 AdoptOpenJDK 提供的压缩档,解压缩后假设目录名称为 jdk8u192-b12-jre ,假设放在 C:下,那完整路径就是, C:\jdk8u192-b12-jre
  2. 开启环境变量设置: 电脑 > (右键)内容 > 高端系统设置 > 环境变量 > 添加或编辑系统变量
  3. 添加 JAVA_HOME :指向 C:\jdk8u192-b12-jre
  4. 编辑 PATH :在最前面加入 %JAVA_HOME%\bin;....后面接原本的内容
  5. 加入 classpath :指向 %JAVA_HOME%\lib

以后要更新 JDK 版本时,只要修改 JAVA_HOME 指向新目录即可。

如果你的 命令提示字符 窗口在设置之前已开启,必须关掉后再重开,然后检查是否安装成功:

java -version
javac -version

Mac 的安装

除了如前 Windows 的安装方式外,还可以使用 Homebrewhomebrew-cask 来安装比较方便。

brew tap adoptopenjdk/openjdk
brew cask install adoptopenjdk # 安装最新版本, 目前是 11
brew cask install adoptopenjdk8 # 安装版本 8
# 安装后目录在
/usr/local/Cellar/adoptopenjdk-openjdk8/jdk8u192-b12/bin/javac

接着就是在 ~/.bash_profile 或是 zsh、fishshell 等的设置档,加入如下设置:

# 指向 JDK 主目录
set JAVA_HOME /usr/local/Cellar/adoptopenjdk-openjdk8/jdk8u192-b12
# 加入 JDK 主目录下的 /bin 到 PATH 变量
set PATH $JAVA_HOME/bin $PATH

重开终端机或运行

source ~/.bash_profile

检查是否安装成功:

java -version
javac -version

Linux 的安装

除了下载压缩档,还可以透过 yum、apt-get 等方式安装,之后一样设置 JAVA_HOME$PATH 变量,然后检查是否成功。

移除 Oracle JDK

当你安装的 OpenJDK 成功后,就赶快移除 Oracle JDK 吧~

Windows 通常在「添加移除程序」或「程序和功能」中可以看到之前的安装,卸载即可。

Mac 必须手动删除文件:

  • /Library/Java/JavaVirtualMachines/ 此目录下的 JDK 目录都删除
  • 删除 /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
  • 删除 /Library/PreferencePanes/JavaControlPanel.prefPane
  • 删除 ~/Library/Application\ Support/Oracle/Java

因为 Applet 及 ControlPanel 都是 Oracle 提供的,OpenJDK 并没有这些东西,这就是前面所提到的某些需要付费的项目,记得把它们都移除。

多久更新一次版本

目前已知 OpenJDK 8 及 11 版为 LTS (长期支持版本), 根据统计 ,目前最多人使用的是 8 版 (79%),而 OpenJDK 8 可能会跟随 Oracle JDK 8 一样支持到 2020 年底 (不确定),如果你不是很追求新功能的话,不必每次有新版本就立即更新 (应该很少人这么做吧),但是安全性修补的更新仍是必要的。