镜像站点 · 本页由第三方 GitHub 只读镜像提供,非 GitHub 官方站点,不接受任何登录或凭据输入。前往 github.com
Skip to content

Notarization zip doesn't keep symbolic links and permissions #509

Open

Description

@fvarrui

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.

Activity

  1. fvarrui commented on Oct 11, 2026

    @fvarrui
    CollaboratorAuthor

    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:

    <pluginRepositories>
        <pluginRepository>
            <id>central-portal-snapshots</id>
            <url>https://central.sonatype.com/repository/maven-snapshots/</url>
            <releases><enabled>false</enabled></releases>
            <snapshots><enabled>true</enabled></snapshots>
        </pluginRepository>
    </pluginRepositories>
    [...]
    <plugin>
        <groupId>io.github.javapackager</groupId>
        <artifactId>javapackager</artifactId>
        <version>2.0.1-SNAPSHOT</version>
        [...]
    </plugin>

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingfixedIssue fixed and release pending

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions