使用jpackage打包正常.jar为Mac .app时提示文件损坏
问题分析与解决方案
核心问题根源
- 架构不匹配:你的M1 MacBook Air是ARM64架构,但使用的是x64版本的OpenJDK,jpackage打包出的是x86_64架构的应用,在macOS Sonoma下会触发系统安全拦截,提示“已损坏”。
- Gatekeeper安全限制:未签名的第三方应用会被系统标记为不安全,即使本身可正常运行。
解决方案1:使用ARM64版本OpenJDK重新打包
这是最根本的解决方式,确保应用与M1架构完全兼容:
- 下载适配ARM64的OpenJDK(比如Adoptium发布的OpenJDK 16 ARM64版本),替换当前的JDK环境。
- 重新执行jpackage打包命令,明确指定ARM架构:
jpackage \ --name GravitySim \ --input test/ \ --main-jar Alphabet.jar \ --main-class Alphabet \ --type dmg \ --arch aarch64
- 安装生成的dmg文件,将.app移至应用程序文件夹后即可正常运行。
解决方案2:临时绕过Gatekeeper拦截(仅用于测试)
如果只是临时测试不想重新打包,可通过终端移除应用的隔离属性:
xattr -r -d com.apple.quarantine /Applications/GravitySim.app
执行完成后再次双击应用即可启动。
解决方案3:给应用签名(适合正式发布)
若需要对外分发应用,必须进行代码签名以通过系统安全校验:
- 在Mac的「钥匙串访问」中创建开发者ID证书(测试可用自签名证书)。
- 使用
codesign命令为应用签名:
codesign -s "你的证书名称" --deep --force --verbose /Applications/GravitySim.app
- 验证签名有效性:
codesign -vvv /Applications/GravitySim.app
- 也可直接在jpackage打包时指定签名参数,自动完成签名:
jpackage \ --name GravitySim \ --input test/ \ --main-jar Alphabet.jar \ --main-class Alphabet \ --type dmg \ --mac-sign \ --mac-signing-key-user-name "你的证书名称"
额外说明:关于字体警告
你单独运行jar时出现的字体警告不影响应用功能,若要消除可在代码中指定系统可用字体,比如将Serif替换为"Times New Roman"或其他macOS自带字体。
内容的提问来源于stack exchange,提问作者Sonic Supreme
相关产品推荐
相关产品推荐

