OpenJDK jpackage打包Mac应用启动器为x64 如何生成arm64版本
问题根因
M1芯片Mac上使用arm64版本OpenJDK 18打包出x86_64架构应用,通常由两个问题导致:
- 环境变量优先级错误,实际调用的是x86_64版本的JDK工具链,通过Rosetta 2转译运行
- JDK 18的jpackage存在默认逻辑缺陷,未显式指定架构时,不会自动继承当前运行环境的arm64架构,默认生成x86_64产物;同时如果jlink生成自定义runtime时未指定架构,也会产出x86_64版本的运行时镜像。
解决步骤
- 先校验当前使用的JDK工具链架构,执行以下命令:
# 校验java二进制架构 file $(which java) # 校验jpackage二进制架构 file $(which jpackage)
如果输出包含x86_64字样,说明当前环境指向的是x86版本OpenJDK,需要先将JAVA_HOME环境变量切换为arm64版本OpenJDK 18的安装路径,再执行后续操作。
- 重新通过jlink生成arm64架构的自定义runtime镜像,执行命令时增加
--target darwin-aarch64参数强制指定目标平台,示例:
jlink \ --module-path $ARM64_JDK_HOME/Contents/Home/jmods \ --add-modules [你的应用依赖的所有JDK模块,如java.desktop、java.logging等] \ --output $RUNTIMEJDK/myruntime \ --strip-debug \ --compress=2 \ --no-man-pages \ --no-header-files \ --target darwin-aarch64
注意:必须删除之前生成的x86版本myruntime目录后重新生成,否则会出现架构不匹配错误。
- 修改jpackage打包命令,增加
--architecture aarch64参数强制指定输出arm64架构产物,修改后完整命令如下:
jpackage create-app-image \ -o "/Workspace/" \ -i /Workspace/installer \ -n MyAppName \ --runtime-image $RUNTIMEJDK/myruntime \ --main-class company.myapp.mainclass \ --main-jar mainclass.jar \ --icon /Workspace/icons/MyAppName.icns \ --vendor "myCompany" \ --description "This is my application" \ --architecture aarch64
- 打包完成后重新校验启动器架构:
lipo -info /Workspace/MyAppName.app/Contents/MacOS/MyAppName
输出结果为Non-fat file: /Workspace/MyAppName.app/Contents/MacOS/MyAppName is architecture: arm64即为配置成功。
补充:如果需要制作同时兼容Intel和M1系列芯片的Universal 2通用包,可以分别打出x86_64、arm64两个架构的app包,再通过lipo -create命令合并两个包内的启动器二进制,整合对应架构的运行时文件即可。
内容的提问来源于stack exchange,提问作者Klaus Friese
相关产品推荐
相关产品推荐

