jpackage codesign 退出码 1 已签名

3

这个月的 macOS Java 应用构建失败,代码中返回 1,签署 libnet.dylib。拷贝 libnet.dylib,尝试使用与 jpackage 相同的 codesign 命令,它说已经签名。

这是其中一个似乎“上个月工作正常,没有变化”的情况。是的,应用程序的 Java 源代码已更改,但生成脚本没有更改,jdk 版本也没有更改。

有任何线索下一步要查找的地方非常感激。

这里是经过编辑的 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)

手动运行 codesign 如上所示 ...

➜  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

编辑以在失败时显示冗长的日志条目

[08:40:50.007] Using default package resource Runtime-Info.plist.template [Java Runtime Info.plist] (add Runtime-Info.plist to the resource-dir to customize).
[08:40:50.016] Running /usr/bin/codesign
[08:40:50.342] Running /usr/bin/codesign
[08:40:51.454] 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.jpackage2766942816810615066/images/image-16726125713601794084/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)

在50.016处的消息似乎是调用codesign来取消签名库,然后下一步是尝试签名失败。如果有办法将失败的codesign实际文本消息显示出来,而不仅仅是其返回码1,那将会非常有用。


1
所以,JDK 版本没有改变,但是 JDK 被重新安装了吗?(或者构建脚本根据需要下载 JDK)。 - Jorn Vernee
感谢提供指针,但没有更新,我使用了temurin和openjdk 17 LTS以及最新的20版本,但问题始终存在。security find_identity显示开发者ID有效,证书将在明年到期。我已经失去了苹果和Oracle之间出现打包神秘停止工作的次数。 - Hamish258
1
我不确定,但我认为jpackage应该在创建软件包时取消所有库的签名,然后重新签名它们。也许取消签名是悄悄失败了。你尝试过使用“--verbose”运行吗? - Jorn Vernee
https://github.com/openjdk/jdk/blob/dfacda488bfbe2e11e8d607a6d08527710286982/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacAppImageBuilder.java#L701 显示它确实应该首先取消签名所有dylibs。详细模式未显示取消签名错误,将添加详细日志提取以显示。 - Hamish258
1个回答

2

希望这能帮助未来的其他人。

当jpackage生成codesign命令时,只有在签署应用程序出现问题时,它才会显示返回代码1。详细模式不会告诉您更多信息。

要找到真正的错误需要重现它。我曾试图复制失败的命名dylib,尝试对其进行签名,并收到“已签名”消息(和返回代码1)。

我需要做的是取消签名libnet.dylib,然后再次尝试签名,这次得到了真正的错误。

➜  autobuild git:(modelrip) ✗ /usr/bin/codesign --remove-signature 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: signed Mach-O thin (x86_64) [org.whiteware.DrumScoreEditorlibnet]
libnet.dylib: timestamps differ by 190 seconds - check your system clock 

关于时钟错误的原因,谁知道呢,我重新启动了一下,然后它就好了...这让我想起了那些“你试过关掉再打开吗”的笑话...真是无语。

1
不错的发现!这也让我想起了jpackage中的--temp <dir>标志,它可以将所有创建的临时文件放在<dir>中。这可能会使重新运行失败的命令并使用完全相同的输入文件变得更加容易。(虽然已经为你太晚了,但希望能帮助未来的读者) - Jorn Vernee
据我所记,codesign 命令有一个 --force 参数,可以覆盖现有的签名。 - Robert
如果确实是由于已签名错误,那么我猜它应该可以工作。如果codesign为不同的错误返回不同的错误代码,或者jpackage从生成的codesign中显示stdout/err,那将非常有用。 - Hamish258

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接