我目前正在为 Apache IoTDB 创建一个 snap,它应该适用于 arm64 和 amd64 架构。
现在我知道这应该是可能的,但我遇到的问题是,如果我使用“stage-packages”,则在列出管理单元的内容时,其中一个包是“openjdk-11-jre-headless”这两种情况我只能看到“squashfs-root/usr/lib/jvm/java-11-openjdk-arm64”
我正在构建一个“core22”图像并为架构定义它:
architectures:
- build-on: [arm64, amd64]
build-for: [arm64]
- build-on: [arm64, amd64]
build-for: [amd64]
我应该提到我正在 M2 Mac 上的 Ubuntu 22.04 VM 上构建。
1、您可以在 snapcraft.yaml 中使用如下语法指定特定于架构的阶段包:
architectures:
- build-on: [amd64]
build-for: [amd64]
- build-on: [arm64]
build-for: [arm64]
parts:
mypart:
plugin: nil
stage-packages:
- on amd64: [openjdk-11-jre-headless:amd64]
- on arm64: [openjdk-11-jre-headless:arm64]
2、查看并验证快照内容: 构建快照后,您可以使用 unsquashfs 工具检查内容以列出文件并检查每个架构是否存在正确的 Java 版本:
unsquashfs -l <your-snap-name>.snap
3、在原生架构上单独构建: 如果可行,请考虑在本机架构环境上单独构建快照(即,使用 AMD64 环境进行 AMD64 构建,使用 ARM64 环境进行 ARM64 构建)。这有时可以帮助避免交叉编译问题,并且是确保正确处理每个架构的好方法。