You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Notarization zip doesn't keep symbolic links and permissions #509
Notarization uploads a zip of the app built with Java's ZipOutputStream, which doesn't keep symbolic links or Unix permissions. Apple recommends ditto -c -k --keepParent for this.
Where
MacPackager, lines 361 to 366: the .app is walked and each file is added with zos.putNextEntry(new ZipEntry(...)).
Symbolic links are stored as copies of their targets and executable bits are lost, so the zip doesn't match the signed app. It may still pass notarization for simple apps, but frameworks or JREs with symbolic links can break the signature check. Not tested yet.
Possible fix
Run ditto -c -k --keepParent <app> <zip>: notarization only runs on macOS, where ditto is always available.
keyChainProfile isn't checked before notarizing either; a missing value should fail early with a clear message.
Fixed in devel (29e3392): the notarization zip is made with ditto -c -k --keepParent, which keeps symbolic links and permissions, and a missing keyChainProfile fails early with a clear message. Notarization needs an Apple Developer account, so it isn't tested in CI: feedback is welcome.
It will ship in 2.0.1, and I'll close this issue then.
How to test 2.0.1-SNAPSHOT
Important
Since 2.0.0 the groupId, the Gradle plugin id and the Java packages are io.github.javapackager (see Upgrading to 2.0).
Maven, add the snapshots repository and use the snapshot version:
Activity
Fix the bugs found while documenting 2.0.0
fvarrui commentedon Oct 11, 2026
Fixed in
devel(29e3392): the notarization zip is made withditto -c -k --keepParent, which keeps symbolic links and permissions, and a missingkeyChainProfilefails early with a clear message. Notarization needs an Apple Developer account, so it isn't tested in CI: feedback is welcome.It will ship in 2.0.1, and I'll close this issue then.
How to test
2.0.1-SNAPSHOTImportant
Since 2.0.0 the
groupId, the Gradle plugin id and the Java packages areio.github.javapackager(see Upgrading to 2.0).Maven, add the snapshots repository and use the snapshot version:
Gradle, add the snapshots repository in
settings.gradle:pluginManagement { repositories { maven { url = 'https://central.sonatype.com/repository/maven-snapshots/' } gradlePluginPortal() } }and use the snapshot version in
build.gradle:plugins { id 'io.github.javapackager' version '2.0.1-SNAPSHOT' }See Snapshot versions for more.