为Apache IoTDB构建跨架构Snap:openjdk架构匹配异常求助
你遇到的问题核心在于:在arm64宿主环境(M2 Mac上的Ubuntu 22.04 arm64虚拟机)交叉构建amd64架构Snap时,stage-packages默认拉取了宿主架构的OpenJDK包,导致两种架构的Snap中均只存在arm64版本的JDK路径。以下是具体解决步骤:
解决步骤
更新snapcraft到最新稳定版
旧版本snapcraft在跨架构stage-packages处理上存在缺陷,先执行更新:sudo snap refresh snapcraft --channel=latest/stable开启Ubuntu虚拟机的multiarch支持
在arm64的Ubuntu系统中添加amd64架构的软件包支持:sudo dpkg --add-architecture amd64 sudo apt update在snapcraft.yaml中明确指定架构匹配的OpenJDK包
利用snapcraft内置的${SNAPCRAFT_ARCH_TRIPLET}变量,让不同架构构建时拉取对应版本的包,修改stage-packages配置:stage-packages: - openjdk-11-jre-headless:${SNAPCRAFT_ARCH_TRIPLET}这样构建arm64时会拉取
openjdk-11-jre-headless:arm64,构建amd64时拉取openjdk-11-jre-headless:amd64。调整架构构建配置(可选,针对交叉构建异常场景)
若交叉构建仍有问题,可改为分架构单独构建,修改architectures配置:architectures: - build-on: arm64 build-for: arm64 - build-on: amd64 build-for: amd64此时在arm64虚拟机上构建amd64架构时,snapcraft会自动通过QEMU模拟amd64环境,确保拉取对应架构的软件包。
验证构建结果
构建完成后,分别解压两种架构的Snap包检查JDK目录:# 检查arm64包 unsquashfs -d arm64-snap your-iotdb-snap_arm64.snap ls arm64-snap/usr/lib/jvm/ # 检查amd64包 unsquashfs -d amd64-snap your-iotdb-snap_amd64.snap ls amd64-snap/usr/lib/jvm/正常情况下会分别看到
java-11-openjdk-arm64和java-11-openjdk-amd64目录。
内容的提问来源于stack exchange,提问作者Christofer Dutz

