使用 ARM64 musl-libs 编译 OpenJDK 9 及更高版本
Compile OpenJDK 9 and up with ARM64 musl-libs
有点背景。
我的目标是在 ARM64 上使用 JRE 创建超薄 docker 映像。
以下是我可以影响最终图像大小的可能区域。
- 使用 JAVA 9 及更高版本允许我利用新的 java 模块功能。
- 使用适用于 ARM64 的 Alpine 可提供超薄的基础映像。
到目前为止我做了什么:
有适用于 ARM64 的 OpenJDK 9 及更高版本,使用模块功能我获得了大约 30M 的 JRE 大小,这是一个了不起的成就。
现在我正在努力转向 Alpine 基础映像,它需要使用 musl-libc 编译 OpenJDK。
我设法用 glibc 重新编译了最新的 OpenJDK,我的问题是用 musl libc 编译 OpenJDK 9 有多复杂,我的理解是,glibc 和 musl 公开相同的接口,基本上,OpenJDK 应该与 musl-libc 兼容。
任何完成此挑战的指导都将不胜感激。
就在 (May/19) - openjdk9
(实验)AArch64 现在可以从 Alpine 存储库获得!
套餐详情:
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: 为扩展评论中的讨论,OpenJDK on musl Alpine 目前正在进行中。最新可用的是 JDK 12 抢先体验,仅适用于 X64:http://jdk.java.net/12。 JDK 9、10 和 11 有开发分支,但没有 GA 和正式发布。根据您对内置 OpenJDK 的使用情况,应认真考虑这一点。
当然,最好使用现成且经过测试的 OpenJDK 二进制文件(如果可用)。
注意 2: 以下步骤是在 X86 上通过 Alpine 3.8 传统磁盘安装(不是 docker)使用 OpenJDK 11 测试的工作站。
先决条件:
包
在构建之前应该安装以下包(希望我没有遗漏任何包):
// 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 有分支。如上所述,它们是实验性的。
抢开JDK11源码:
hg clone https://hg.openjdk.java.net/portola/jdk11
建筑:
设置完所有内容后,构建就非常简单了。我用过:
cd jdk11
bash configure
make JOBS=8 LOG=info hotspot
参考文献:
如需进一步参考,请参阅 JDK11 构建说明(不适用于 Alpine):
打开JDK交叉编译:
有点背景。
我的目标是在 ARM64 上使用 JRE 创建超薄 docker 映像。 以下是我可以影响最终图像大小的可能区域。
- 使用 JAVA 9 及更高版本允许我利用新的 java 模块功能。
- 使用适用于 ARM64 的 Alpine 可提供超薄的基础映像。
到目前为止我做了什么: 有适用于 ARM64 的 OpenJDK 9 及更高版本,使用模块功能我获得了大约 30M 的 JRE 大小,这是一个了不起的成就。
现在我正在努力转向 Alpine 基础映像,它需要使用 musl-libc 编译 OpenJDK。 我设法用 glibc 重新编译了最新的 OpenJDK,我的问题是用 musl libc 编译 OpenJDK 9 有多复杂,我的理解是,glibc 和 musl 公开相同的接口,基本上,OpenJDK 应该与 musl-libc 兼容。
任何完成此挑战的指导都将不胜感激。
就在 (May/19) - openjdk9
(实验)AArch64 现在可以从 Alpine 存储库获得!
套餐详情: 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: 为扩展评论中的讨论,OpenJDK on musl Alpine 目前正在进行中。最新可用的是 JDK 12 抢先体验,仅适用于 X64:http://jdk.java.net/12。 JDK 9、10 和 11 有开发分支,但没有 GA 和正式发布。根据您对内置 OpenJDK 的使用情况,应认真考虑这一点。
当然,最好使用现成且经过测试的 OpenJDK 二进制文件(如果可用)。
注意 2: 以下步骤是在 X86 上通过 Alpine 3.8 传统磁盘安装(不是 docker)使用 OpenJDK 11 测试的工作站。
先决条件:
包
在构建之前应该安装以下包(希望我没有遗漏任何包):
// 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 有分支。如上所述,它们是实验性的。
抢开JDK11源码:
hg clone https://hg.openjdk.java.net/portola/jdk11
建筑:
设置完所有内容后,构建就非常简单了。我用过:
cd jdk11
bash configure
make JOBS=8 LOG=info hotspot
参考文献:
如需进一步参考,请参阅 JDK11 构建说明(不适用于 Alpine):
打开JDK交叉编译: