You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:24:17