【问题标题】:Compile OpenJDK 9 and up with ARM64 musl-libs使用 ARM64 musl-libs 编译 OpenJDK 9 及更高版本
【发布时间】:2019-03-18 22:28:10
【问题描述】:

一点背景。

我的目标是在 ARM64 上使用 JRE 创建一个超薄的 docker 映像。 以下是我可以影响最终图像大小的可能区域。

  1. 使用 JAVA 9 及更高版本允许我利用新的 Java 模块功能。
  2. 将 Alpine 用于 ARM64 可提供超薄的基础映像。

到目前为止我做了什么: 有针对 ARM64 的 OpenJDK 9 及更高版本,使用模块功能我得到了大约 30M 的 JRE 大小,这是一个了不起的成就。

现在我正在着手迁移到 Alpine 基础映像,它需要使用 musl-libc 编译 OpenJDK。 我设法用glibc重新编译了最新的OpenJDK,我的问题是用musl libc编译OpenJDK 9有多复杂,我的理解是,glibc和musl暴露了相同的接口,基本上,OpenJDK应该与musl-libc兼容。

我们将不胜感激任何应对这一挑战的方向。

【问题讨论】:

  • OpenJDK 是 Alpine 的官方 Java 实现并且支持 musl,所以在 Alpine 上构建 musl 应该很简单。您可以从 Portola 主页开始:openjdk.java.net/projects/portola。实验性 jdk9 fork 在这里:hg.openjdk.java.net/portola/jdk9
  • 请注意,Alpine 上只有 OpenJDK 7 和 8 被 GA'd;然后有 11 个早期访问版本,现在已经消失了。 9号和10号没有发布。因此,虽然您可以尝试自己构建 Portola 分支,但您可能会遇到实现本身的功能问题。这是主要问题,IMO。
  • 实际上,OpenJDK 12 早期访问仅在 3 天前才可用(对于 x64:jdk.java.net/12),因此它似乎正在积极开发中 - 您可能会考虑,而不是 9。很有可能,它会状态更好,并且可能会在 12 正式版中看到修复。
  • Valiano,非常感谢您的建议。您提到的 OpenJDK 11 在 x86 上为我工作,但我没有在 ARM64 上找到适用于 Alpine 的 OpenJDK 11 版本。
  • 当然,丹尼斯。不幸的是,我估计早期访问版本仅适用于 x64。我找不到任何现成的 ARM64 musl 构建 - 我最接近的是 Aleksey Shipilëv 的 CI 站点上的 ARM32 构建:builds.shipilev.net

标签: java docker arm64 alpine musl


【解决方案1】:

就在(5 月/19 日)-openjdk9(实验性)现在可以从 Alpine 存储库中获得 AArch64!

包裹详情: https://pkgs.alpinelinux.org/package/edge/testing/aarch64/openjdk9

使用:

apk add openjdk9 --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing

前几天我不得不在 musl Alpine 3.8 上从源代码构建 OpenJDK。幸运的是,它非常顺利!因此,如果您最终不得不从源代码构建 OpenJDK 以获得 ARM64 musl 支持,您可以按照这些步骤对您的目标进行一些修改。

注 1: 为了扩展 cmets 中的讨论,musl Alpine 上的 OpenJDK 目前正在进行中。最新可用的是 JDK 12 早期访问,仅适用于 X64:http://jdk.java.net/12。 JDK 9、10 和 11 有开发分支,但不是 GA 并正式发布。根据您对构建的 OpenJDK 的使用情况,应该认真考虑这一点。

当然,如果可用的话,最好使用现成和经过测试的 OpenJDK 二进制文件。

注意 2: 以下步骤是在 X86 工作站上使用 OpenJDK 11,在 Alpine 3.8 传统磁盘安装(不是 docker)上测试的。

先决条件:

应在构建之前安装以下软件包(希望我没有遗漏任何软件包):

// build tools and utilities  
apk add build-base autoconf bash coreutils gawk grep mercurial zip  
// X11 libraries   
apk add libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev  
// Additional libraries  
apk add alsa-lib-dev cups-dev fontconfig-dev

启动 JDK

然后,具有讽刺意味的是,您需要一个启动 JDK:安装与以前版本相同的 OpenJDK...它可能是在主机上运行的 OpenJDK(未交叉编译),因此您应该着手使用 OpenJDK 10 或 11 musl X86 构建。

在某个时候,提供了一个 OpenJDK 11 早期访问二进制文件,但它已从 OpenJDK download page 中删除,因为它还没有准备好生产。对于 JDK 引导,这可能就足够了,因此请尝试获取它:openjdk-11+28_linux-x64-musl_bin.tar.gz。如果您想(或必须)坚持使用 JDK9,则可以使用 OpenJDK 8 进行引导,并且没有问题,因为它可以作为 openjdk8 apk 包使用。

通常启动 JDK 会由构建自动选择,但如果没有,您可以指定它以使用 --with-boot-jdk=[path-to-jdk] 进行配置。

来源:

对于 Alpine OpenJDK 构建,您应该使用 OpenJDK 的 Portola 分支。这些已经与 musl 兼容。 JDK 9、10 和 11 有分支。如上所述,它们是实验性的。

获取 OpenJDK 11 源代码:

hg clone https://hg.openjdk.java.net/portola/jdk11

建筑:

一切就绪后,构建就非常简单了。我用过:

cd jdk11
bash configure
make JOBS=8 LOG=info hotspot

参考资料:

如需进一步参考,请参阅 JDK11 构建说明(并非专门针对 Alpine):

OpenJDK 交叉编译:

【讨论】:

  • 非常感谢您分享您的经验。到目前为止,编译 Portola 源代码是我最喜欢的方向,唯一关心的是在我开始构建过程之前,Boot JDK 的问题,正如我所说我的目标架构是 ARM64,我不确定我能找到任何可用的 JDK 和 musl对于 JDK 9 之前的 ARM64。根据您的指示,并且我认为它必须是两者。我是正确的还是有一些技巧。有没有办法在 x86 上为 ARM64 编译 JDK?
  • @DenisVolohsin 当然,在 x86 上为 ARM64 编译实际上是首选方法 - 它称为交叉编译:编译器和构建工具被指示为指定目标生成代码和二进制文件。这需要工具链和项目构建系统的支持。在 OpenJDK 中,使用 --openjdk-target=arm-linux-gnueabihf 配置构建将生成 ARM OpenJDK 二进制文件。 OpenJDK 构建页面有详细的交叉构建说明:cr.openjdk.java.net/~ihse/demo-new-build-readme/common/doc/…
  • 太好了,谢谢。现在我已经准备好开始我的冒险之旅,征战 OpenJDK 构建 :)
  • @DenisVolohsin Godspeed!
  • @DenisVoloshin 已经有一段时间了,但您可能有兴趣知道 openjdk9openjdk10 现在可以从 Alpine 存储库 (edge/testing) 获得。我在答案中添加了详细信息。 HTH!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 2021-11-07
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
相关资源
最近更新 更多