diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 610fc82..3b08ab3 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -252,6 +252,14 @@ jobs:
gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}
gpg-passphrase: MAVEN_GPG_PASSPHRASE
+ - name: Scope the Central credentials to central.sonatype.com
+ # Maven 3.10 offers the credentials of a settings server only to repositories declared with
+ # that id, and 'central' is also the id of Maven Central: without this origin the Central
+ # snapshot repository and publisher API get no credentials (401), see CONTRIBUTING.md.
+ run: |
+ sed -i 's|central|centralhttps://central.sonatype.com|' ~/.m2/settings.xml
+ grep -c 'https://central.sonatype.com' ~/.m2/settings.xml
+
- name: Publish snapshots
# only a snapshot version: on release day main carries the release version for one
# commit, and that one is published by release.yml from the tag
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 1017320..03f8e9e 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -32,6 +32,14 @@ jobs:
gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}
gpg-passphrase: MAVEN_GPG_PASSPHRASE
+ - name: Scope the Central credentials to central.sonatype.com
+ # Maven 3.10 offers the credentials of a settings server only to repositories declared with
+ # that id, and 'central' is also the id of Maven Central: without this origin the Central
+ # snapshot repository and publisher API get no credentials (401), see CONTRIBUTING.md.
+ run: |
+ sed -i 's|central|centralhttps://central.sonatype.com|' ~/.m2/settings.xml
+ grep -c 'https://central.sonatype.com' ~/.m2/settings.xml
+
- name: Check that the tag matches the project version
run: |
version=$(./mvnw -q -N --no-transfer-progress org.apache.maven.plugins:maven-help-plugin:3.5.1:evaluate -Dexpression=project.version -DforceStdout)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 32fa090..b8dd3cc 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -123,6 +123,14 @@ Snapshots of `main` are published by `ci.yml` to the
repository variable `PUBLISH_SNAPSHOTS` is `true`. Consumers add that repository with
`true`.
+Both workflows let `setup-java` write the `settings.xml` with the Central token as the server
+`central`, and then add `https://central.sonatype.com` to that
+server. Maven 3.10 offers the credentials of a settings server only to repositories whose origin it
+can associate with the server id, and `central` is also the id of Maven Central, so without the
+origin the uploads to `central.sonatype.com` get no credentials and fail with `401`. (The alternative,
+`-Dmaven.repository.credentialScope=id`, restores the id-only matching of Maven 3.9 for every
+server.)
+
To try the release build locally without signing or uploading:
`./mvnw -Prelease -Dgpg.skip verify`. With the key in the local keyring, set `MAVEN_GPG_PASSPHRASE`
to sign as well; the passphrase never goes on the command line.