在Ubuntu 18.04上安装OpenJDK 11

Installing OpenJDK 11 on Ubuntu 18.04

OpenJDK 11于2018年9月25日发布。由于这是版本8之后的第一个LTS版本,因此已经有很长时间了。在Ubuntu 18.04(Bionic Beaver)上安装了该软件包后,它附带了一个名为openjdk-11-jdk的软件包,令我惊讶的是,它仍然是早期版本(Java 10)的一部分。

OpenJDK的SRU异常

Ubuntu Foundation团队为OpenJDK设置了SRU例外。尽管版本10是非LTS发行版,但他们将其打包为openjdk-11-jdk,直到OpenJDK 11正式发布。该选择基于以下假设:版本10和版本11之间的接口增量要比版本8和11之间的接口增量小得多。

这是一个很好的推论,也许apt-get upgrade不会使OpenJDK的版本从10猛增到11时的问题。

尽管有一个很小的区域,但是10和11之间存在显着差异-Flight Recorderis现在是开源的。 OpenJDK 10不包含飞行记录器。当时,它是Oracle JDK的商业功能,但OpenJDK 11随它一起提供。

结果,安装openjdk-11-jdk不允许使用JFR来检测应用程序,因为用于启用该功能的JVM选项根本无法被OpenJDK 10识别。实际上,JVM无法启动,并且抱怨无法识别的选项。

安装Ubuntu的默认JDK

这很简单,您只需要以下软件包。

1
% apt-get install default-jdk

但是,请确保检查实际安装的Java版本。

1
2
3
4
$ java -version
openjdk version"10.0.2" 2018-07-17
OpenJDK Runtime Environment (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.2)
OpenJDK 64-Bit Server VM (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.2, mixed mode)

手动安装OpenJDK

这也很容易-您只需要下载一个tarball并将其解压缩到某个位置即可。

1
2
3
% wget https://download.java.net/java/GA/jdk11/28/GPL/openjdk-11+28_linux-x64_bin.tar.gz -O /tmp/openjdk-11+28_linux-x64_bin.tar.gz
% sudo tar xfvz /tmp/openjdk-11+28_linux-x64_bin.tar.gz --directory /usr/lib/jvm
% rm -f /tmp/openjdk-11+28_linux-x64_bin.tar.gz

这将是真正的OpenJDK 11。

1
2
3
4
$ /usr/lib/jvm/jdk-11/bin/java -version
openjdk version"11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)

在JDK之间切换

我更喜欢使用发行版的JDK,只要它可以处理当前的任务即可。在这种情况下,这不是一个选择,至少现在还不是。因此,我正在使用替代框架,这使得在JDK之间轻松切换成为可能。

1
2
% sudo sh -c 'for bin in /usr/lib/jvm/jdk-11/bin/*; do update-alternatives --install /usr/bin/$(basename $bin) $(basename $bin) $bin 100; done'
% sudo sh -c 'for bin in /usr/lib/jvm/jdk-11/bin/*; do update-alternatives --set $(basename $bin) $bin; done'

一旦OpenJDK 11出现在Ubuntu 18.04中,将只是软件包升级以及要使用的替代开关的问题。

1
2
3
4
5
6
7
8
9
10
11
% sudo apt-get install --only-upgrade default-jdk
% update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                         Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-11-openjdk-amd64/bin/java   1101      auto mode
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java   1101      manual mode
* 2            /usr/lib/jvm/jdk-11/bin/java                  100       manual mode

Press <enter> to keep the current choice[*], or type selection number: