为什么 OpenJDK 10 打包为 openjdk-11-*?

tu-*_*duh 72 package-management versions java openjdk

虽然希望从源代码编译 OpenJDK,但最新的通用版本 ( OpenJDK 10.0.1 ) 坚持使用 OpenJDK 9 或 10。然而,JDK 11 将在20189 月之前发布。

然而,令我惊讶的是,当我这样做时apt search openjdk,结果是:

...
openjdk-11-jdk - OpenJDK Development Kit (JDK)
...
openjdk-8-jdk - OpenJDK Development Kit (JDK)
...
Run Code Online (Sandbox Code Playgroud)

没有 OpenJDK 9 或 10!

等等,那是 OpenJDK 11 吗?也许是 Beta 版?不……

所以我看了看apt show openjdk-11-jdk

Package: openjdk-11-jdk
Version: 10.0.1+10-3ubuntu1
...
Run Code Online (Sandbox Code Playgroud)

为什么 OpenJDK 10 被打包为 openjdk-11-*??

mur*_*uru 63

这是因为这些包在发布时将成为 OpenJDK 11。请参阅此邮件列表帖子

我代表 Ubuntu Foundations 团队,请求 OpenJDK 的 SRU 例外。我们的计划是发布 OpenJDK 10 作为Bionic的默认 JRE/JDK 1,然后在 2018 年 9 月/10 月将主要的默认 JRE/JDK 作为 SRU 移动到 OpenJDK 11。

= 提议的计划 =

Bionic 将与 OpenJDK 10 一起发布,作为默认的 JRE/JDK,一旦达到 GA,OpenJDK 11 将替换它。

...

如果我们打算在发布后切换到仿生中的 OpenJDK 11,我们希望避免在发布时将 OpenJDK 8 作为仿生中的默认 JRE/JDK,因为存在于 8 和 11 之间的任何额外的接口增量不仅会暴露档案损坏,它还使 JDK 的外部使用者暴露在损坏的情况下。相比之下,OpenJDK 10 和 OpenJDK 11 之间的接口增量预计相当小,尤其是与我们已经知道的 OpenJDK 8 和 OpenJDK 9 之间的增量相比,该增量相当大。因此,我们应该在 18.04 中将 OpenJDK 10 作为默认 JDK 发布,并在发布时过渡到 OpenJDK 11。

这也是为什么源包openjdk-11-*实际上被称为openjdk-lts.


已提交错误报告- 请订阅它(但不要发表评论,除非您有新信息要添加,这不太可能)。一位 Ubuntu 开发者 Jeremy Bicha 回应道:

目的是在 Ubuntu 18.04 LTS 中将 openjdk-11 升级到 11。这就是它被这样命名的原因。这是一个重大变化,需要一些时间来准备。没有必要要求它完成,因为它会完成。

Ubuntu 18.04 LTS 在 OpenJDK 11 发布前几个月发布,因此在 Ubuntu 18.04 LTS 发布之前无法提供 OpenJDK 11。

https://lists.ubuntu.com/archives/ubuntu-release/2018-March/004364.html

带来不便敬请谅解。

2018-11-24:请不要要求 ETA。这会向订阅此错误的每个人发送一封电子邮件,但无助于修复错误。

这个错误正在处理中。openjdk 11.0.1 在 18.10 中更新,并且有一个安全更新需要在 18.04 LTS 中快速处理。11.0.1 准备就绪后将成为 18.04 LTS,但这是一个需要仔细协调的重大变化。

2019-02-26:此错误已在错误 1814133 中处理,因此我将其标记为重复。应该在那个错误上而不是在这里进行进一步的讨论。


一个新的错误报告已经打开,用于跟踪所有需要进行的更改,其中有很多- 粗略计数为 140。错误报告的摘录:

此转换是 openjdk-lts 从 openjdk-10 到 openjdk-11 的安全更新。这引入了运行时和 FTBFS 问题,这也需要将多个包向后移植到安全口袋中。

这些软件包是在https://launchpad.net/~openjdk-11-transition团队下的 PPA 上构建的 。PPA 仅依赖于安全袋并分阶段进行分离。

基金会和安全团队之间商定的流程是,PPA 中的包将被二进制复制到仿生建议中,检查迁移问题,并且 - 没有未决问题 - 复制到仿生安全中。

[...]

Cosmic 中可能还需要更新一些软件包,但作为例外,将在 Bionic 转换完成后进行。

另一个 Ubuntu 开发者Tiago Stürmer Daitx 指出

[我们] 计划更新受此转换影响的 Java 应用程序。

更具体地说,任何无法使用 openjdk-11 正确运行的包都将被调查,并且是更新的候选者。更新并不一定意味着我们将使用最新版本:我们可能只是应用或向后移植允许它们在 openjdk-11 下工作的更改。

目前还没有ETA。相当多的软件包已经更新并添加到由过渡团队维护的各种 PPA 中,因此如果您希望帮助进行测试,请查看它们。


2019 年 4 月 17 日更新:

似乎已经发布了修复程序。现在apt show openjdk-11-jdk显示:

Package: openjdk-11-jdk
Version: 11.0.2+9-3ubuntu1~18.04.3
Run Code Online (Sandbox Code Playgroud)

的输出java -version是:

openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment (build 11.0.2+9-Ubuntu-3ubuntu118.04.3)
OpenJDK 64-Bit Server VM (build 11.0.2+9-Ubuntu-3ubuntu118.04.3, mixed mode, sharing)
Run Code Online (Sandbox Code Playgroud)

  • @9ilsdx9rvj0lo 有人提交了错误报告,请密切关注:https://bugs.launchpad.net/ubuntu/+source/openjdk-lts/+bug/1796027 (14认同)
  • 我相信评论,但我看不出他们如何有效地错误分类 jdk 版本是正确的做法。这很令人困惑,我会说,有点不诚实。只要有可供我们选择的版本,我们就可以自己做`update-alternatives`。感谢@muru 的回答 (10认同)
  • @muru 现在快一个月了,还是没有大的延迟? (10认同)
  • 才两天?这么大的延迟?Oo 这是 Canonical 多年来一直致力于支持的软件包。我相信您可以使用您的 Canonical 订阅来要求更快的发布。 (6认同)
  • 但是,知道发布日期并不会缩短 QA 所需的时间。如果您赶时间,PPA 已更新:https://launchpad.net/~openjdk-r/+archive/ubuntu/ppa 我希望这些软件包很快就会被提出,并从那里开始更新。 (5认同)
  • @SinaMadani 的问题是,现在存储库的工作方式导致了两种选择:必须由 Canonical 维护 5 年的 openjdk-10 包,或成为 openjdk-11 的过渡包的 openjdk-10 包. 第一个是不切实际的,第二个实际上是现在正在发生的事情,麻烦更少。 (4认同)
  • Java 11 发布已经 2 天了,这些包仍在提供 Java 10.0.2。我想知道为什么会有这么大的延迟? (3认同)
  • @DanielHinojosa 我同意。他们应该只使用“default-jdk”包并随着时间的推移更新它而不是误导人们关于版本。 (3认同)
  • 这是一个非常愚蠢的决定——现在是 2019 年 2 月,这些包仍然提供 Java 10。Java 11 确实做出了重大改变,可能破坏了很多东西,而且他们不敢更新。请让这成为一个教训:永远不要在主要版本号上撒谎。 (3认同)

小智 5

见上面muru的回答,

但是为了解决这个问题,您可以手动安装 openjdk 11 并将其添加到 update-alternatives 中,以便您可以切换版本,当官方软件包更新时,您可以切换到该版本。请参阅下面的内容:

$ wget https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz -O /tmp/openjdk-11.0.2_linux-x64_bin.tar.gz

$ sudo tar xfvz /tmp/openjdk-11.0.2_linux-x64_bin.tar.gz --directory /usr/lib/jvm
Run Code Online (Sandbox Code Playgroud)

解压/usr/lib/jvm/jdk-11.0.2下的jdk

然后将其添加到替代系统

sudo sh -c 'for bin in /usr/lib/jvm/jdk-11.0.2/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.0.2/bin/*; do update-alternatives --set $(basename $bin) $bin; done'
Run Code Online (Sandbox Code Playgroud)

在替代品中看到它

$ sudo update-alternatives --config java
There are 3 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/java-8-openjdk-amd64/jre/bin/java   1081      manual mode
* 3            /usr/lib/jvm/jdk-11.0.2/bin/java                 100       manual mode

Press <enter> to keep the current choice[*], or type selection number: 3
Run Code Online (Sandbox Code Playgroud)

检查它是否有效

$ java -version
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
Run Code Online (Sandbox Code Playgroud)