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

macOS Java应用jpackage签名失败:libnet.dylib提示已签名

排查macOS jpackage codesign libnet.dylib签名失败问题

核心问题

本月构建macOS Java应用时,jpackage执行codesign对libnet.dylib签名返回退出码1失败,但手动复制同文件执行相同签名命令时,系统提示该文件已签名。上月构建正常,未修改构建脚本、JDK版本,仅变更了应用Java源码。

相关信息

  • jpackage命令:
$JAVA_HOME/bin/jpackage --verbose \
  --dest bundles \
  --input build \
  --name DrumScoreEditor \
  --main-class org.whiteware.DrumScoreEditor \
  --main-jar DrumScoreEditor_$VERSION.jar \
  --add-modules java.base,java.desktop,java.datatransfer,java.prefs,java.xml,java.logging \
  --java-options "--add-opens java.desktop/com.apple.eawt.event=ALL-UNNAMED" \
  --app-version $VERSION \
  --copyright "Copyright (c) 2023 Alan R. White" \
  --vendor "drumscore.scot" \
  --file-associations autobuild/filetypes.txt \
  --mac-sign \
  --mac-package-signing-prefix org.whiteware.DrumScoreEditor \
  --mac-signing-key-user-name "Alan White (REDACTED)" \
  --mac-package-name "Drum Score Editor" \
  --mac-entitlements autobuild/entitlements.txt \
  --resource-dir package/macosx
  • 错误日志片段:
[17:50:24.874] Running /usr/bin/codesign
[17:50:25.526] java.io.IOException: Command [/usr/bin/codesign, -s, Developer ID Application: Alan White (REDACTED), -vvvv, --timestamp, --options, runtime, --prefix, org.whiteware.DrumScoreEditor, /var/folders/70/dxx7_3xn7kq1wl8bq0sfnch40000gn/T/jdk.jpackage10506364833728775098/images/image-10320893665944302794/DrumScoreEditor.app/Contents/runtime/Contents/Home/lib/libnet.dylib] exited with 1 code
    at jdk.jpackage/jdk.jpackage.internal.Executor.executeExpectSuccess(Executor.java:90)
    at jdk.jpackage/jdk.jpackage.internal.IOUtils.exec(IOUtils.java:215)
  • 手动签名结果:
➜  autobuild git:(modelrip) ✗ cp /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home/lib/libnet.dylib .
➜  autobuild git:(modelrip) ✗ /usr/bin/codesign -s "Developer ID Application: Alan White (REDACTED)" -vvvv --timestamp --options runtime --prefix org.whiteware.DrumScoreEditor libnet.dylib
libnet.dylib: is already signed

下一步排查方向

1. 捕获codesign的完整错误输出

jpackage默认仅返回退出码,需获取codesign的stderr输出定位具体原因:

  • 在jpackage命令前添加环境变量,强制输出完整子命令日志:
    JAVA_TOOL_OPTIONS="-Djdk.jpackage.debug=true" $JAVA_HOME/bin/jpackage ...
    
  • 构建失败后立即复制临时目录中的libnet.dylib到本地,手动执行签名命令查看详细错误:
    # 复制临时文件
    cp /var/folders/70/dxx7_3xn7kq1wl8bq0sfnch40000gn/T/jdk.jpackageXXXXXX/images/image-XXXXXX/DrumScoreEditor.app/Contents/runtime/Contents/Home/lib/libnet.dylib ./temp-libnet.dylib
    # 执行签名命令
    /usr/bin/codesign -s "Developer ID Application: Alan White (REDACTED)" -vvvv --timestamp --options runtime --prefix org.whiteware.DrumScoreEditor ./temp-libnet.dylib
    

2. 检查临时文件的权限与状态

jpackage生成的临时文件可能存在权限异常或被锁定:

  • 查看文件权限:
    ls -l /var/folders/70/dxx7_3xn7kq1wl8bq0sfnch40000gn/T/jdk.jpackageXXXXXX/images/image-XXXXXX/DrumScoreEditor.app/Contents/runtime/Contents/Home/lib/libnet.dylib
    
  • 检查文件是否被进程占用:
    lsof /var/folders/70/dxx7_3xn7kq1wl8bq0sfnch40000gn/T/jdk.jpackageXXXXXX/images/image-XXXXXX/DrumScoreEditor.app/Contents/runtime/Contents/Home/lib/libnet.dylib
    

3. 验证签名前缀与原有签名的冲突

--mac-package-signing-prefix可能和JDK自带的libnet.dylib原有签名冲突:

  • 查看临时文件的原有签名信息:
    codesign -dvvv /var/folders/70/dxx7_3xn7kq1wl8bq0sfnch40000gn/T/jdk.jpackageXXXXXX/images/image-XXXXXX/DrumScoreEditor.app/Contents/runtime/Contents/Home/lib/libnet.dylib
    
  • 尝试移除--prefix参数手动签名,测试是否成功:
    /usr/bin/codesign -s "Developer ID Application: Alan White (REDACTED)" -vvvv --timestamp --options runtime ./temp-libnet.dylib
    

4. 检查entitlements文件的有效性

entitlements文件格式错误或权限问题可能导致签名失败:

  • 验证文件格式:
    plutil -lint autobuild/entitlements.txt
    
  • 移除--mac-entitlements参数重新执行jpackage,排除该文件的影响。

5. 清理构建与系统签名缓存

  • 删除jpackage临时目录:
    rm -rf /var/folders/70/dxx7_3xn7kq1wl8bq0sfnch40000gn/T/jdk.jpackage*
    
  • 清理系统签名缓存:
    sudo rm -rf /Library/Caches/com.apple.xbs/Signatures
    
  • 打开Keychain Access,删除旧的Developer ID证书后重新导入。

6. 验证JDK文件完整性

即使JDK版本未变,也可能存在文件损坏:

  • 重新下载安装同版本Temurin 17 JDK,替换现有JDK后重新构建。
  • 对比原始JDK与临时目录中的libnet.dylib是否一致:
    diff /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home/lib/libnet.dylib ./temp-libnet.dylib
    

内容的提问来源于stack exchange,提问作者Hamish258

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 16:40:06