IMPORTANT: Developer documentation for the current development branch. This content is unreleased, may change without notice, and must not be treated as Buildish release documentation.

Checksums and signing

Preserve native sidecars and optionally generate missing checksums and signatures.

Shared preparation validates retained MD5, SHA-1, SHA-256 and SHA-512 checksums and completes absent checksums for primary publication files and retained native snapshot metadata. Valid existing bytes are preserved. Malformed or mismatching checksums, orphan sidecars and destination collisions fail. It does not perform full Central admission validation or cryptographic verification of signatures.

By default, every primary file (including POM and emitted .module) must have a nonempty signature. Existing signatures are preserved. Missing-signature generation is off by default; when enabled, only absent primary signatures are generated. An existing empty signature fails the presence policy and is not repaired. Existing signature checksums are checked and retained, but no new checksums of signatures, recursive sidecars or signatures of checksums/snapshot metadata are generated.

Policy precedence is explicit preparation option > project property > settings convention. Project properties accept only true or false, case-insensitively. Only :prepareAtrMavenBundle accepts the Boolean options and their inverse forms:

1# Unsigned output, using one policy for every requested creator.
2./gradlew -PatrMavenBundle.requireSignatures=false :atrCentralArchive :atrNjordFiles
3
4# Equivalent task options; disabling generation is a separate choice.
5./gradlew :prepareAtrMavenBundle --no-require-signatures --no-sign-missing :atrCentralArchive :atrNjordFiles
6
7# Generate missing signatures once, then require them for both archives.
8./gradlew :prepareAtrMavenBundle --sign-missing :atrCentralArchive :atrNjordArchive

Settings can opt out with requireSignatures.set(false) and can enable generation with signMissing.set(true). The project properties are atrMavenBundle.requireSignatures and atrMavenBundle.signMissing. Creator and lifecycle tasks reject preparation options; put options immediately after the preparation task as shown.

Root signing

Generation uses the root project’s public Gradle signing configuration. The plugin applies root signing but creates no native per-publication Sign tasks. For Kotlin DSL signing accessors, explicitly declare signing in the root project too. One possible configuration uses the normal Gradle in-memory signer:

1plugins { signing }
2signing {
3    useInMemoryPgpKeys(
4        providers.gradleProperty("signingKey").orNull,
5        providers.gradleProperty("signingPassword").orNull,
6    )
7}

Supply signing material using your normal local Gradle practices. Gradle’s other root signing configurations, including useGpgCmd(), can also provide the signatory; GPG agent, hardware and keyring setup remain user-managed. A signer is required only when a requested preparation actually needs to generate a missing signature. Already-present signatures require no signer even when signMissing=true. Missing files are signed individually, so hardware signing may require one touch per primary. A preparation that runs again can sign again; configuration-cache reuse does not promise skipped signing or reproducible new signature bytes. The plugin never imports keys or configures a keyring.

Disabling generation also prevents input snapshotting from inspecting the configured signer’s key identity. When generation is enabled, Gradle can inspect a configured signer while evaluating task inputs, even if native signatures are already present.

Common failures

Failure Action
Missing or empty signature Supply native signatures, enable generation, or explicitly disable the presence requirement. An empty existing signature must be replaced at its source.
No root signatory configured Configure root Gradle signing before requesting generation of absent signatures.
Checksum mismatch Correct the exported payload or its existing checksum; mismatching sidecars are not silently replaced.
Destination collision Give the selected publications distinct repository paths, or exclude one publication.
Unknown option on an output task Put Boolean options immediately after :prepareAtrMavenBundle.

See configuration for settings and exclusions.