はじめに
2024年6月に Sonatype における認証システムが変更され、ユーザートークンでの認証が必要になったようです。
従来のユーザ名とパスワードで Publish しようとした場合、以下のような認証エラーとなります。
Execution failed for task ':lib:publishMavenJavaPublicationToMavenCentralRepository'. > Failed to publish publication 'mavenJava' to repository 'MavenCentral' > Could not PUT 'https://oss.sonatype.org/service/local/staging/deploy/maven2/xxx/xxx.jar'. Received status code 401 from server: Content access is protected by token
ユーザートークンへの切り替え手順についてまとめておきます。
ユーザートークンの発行
https://oss.sonatype.org/ にログインして Profile に移動

User Token を選択して Access User Token ボタンを押下

以下のようにユーザートークンが発行される(トークン : トークンパスワード)

ユーザートークンの設定
以下に従った、Gradle プロジェクトを前提とします。
ユーザホームの ~/.gradle/gradle.properties ユーザートークンを設定します。
signing.keyId=812DXXXX signing.password=鍵作成時のパスフレーズ signing.secretKeyRingFile=/Users/XXXXX/.gnupg/secring.gpg ossrhToken=トークン ossrhTokenPassword=トークンパスワード
build.gradle.kts を以下のように構成します。
val ossrhToken: String? by project val ossrhTokenPassword: String? by project publishing { ... repositories { maven { name = "MavenCentral" val releasesRepoUrl = uri("https://oss.sonatype.org/service/local/staging/deploy/maven2") val snapshotsRepoUrl = uri("https://oss.sonatype.org/content/repositories/snapshots") url = if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else releasesRepoUrl credentials { username = ossrhToken password = ossrhTokenPassword } } } }
publishing プラグインと signing プラグイン含めた全体像は以下のようになります。
plugins {
// ...
`maven-publish`
signing
}
// ...
group = "Your Group Id"
version = "X.X.X"
val ossrhToken: String? by project
val ossrhTokenPassword: String? by project
java {
withJavadocJar()
withSourcesJar()
}
publishing {
publications {
create<MavenPublication>("mavenJava") {
artifactId = "プロジェクト名"
from(components["java"])
versionMapping {
usage("java-api") {
fromResolutionOf("runtimeClasspath")
}
usage("java-runtime") {
fromResolutionResult()
}
}
pom {
name.set("プロジェクト名")
description.set("プロジェクトの説明")
url.set("プロジェクトURL(GithubのURL)")
licenses {
license {
name.set("The Apache License, Version 2.0")
url.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
}
}
developers {
developer {
id.set("Your ID")
name.set("Your name")
email.set("Your email address")
}
}
scm {
connection.set("git@github.com:XXXXX.git")
developerConnection.set("git@github.com:XXXXX.git")
url.set("https://github.com/XXXXX")
}
}
}
}
repositories {
maven {
val releasesRepoUrl = uri("https://oss.sonatype.org/service/local/staging/deploy/maven2")
val snapshotsRepoUrl = uri("https://oss.sonatype.org/content/repositories/snapshots")
url = if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else releasesRepoUrl
credentials {
username = ossrhToken
password = ossrhTokenPassword
}
}
}
}
signing {
sign(publishing.publications["mavenJava"])
}
publish 実行
以上で、ユーザートークンの設定は完了です。
以下のようにして発行できるようになります。
./gradlew publish BUILD SUCCESSFUL in 36s 9 actionable tasks: 3 executed, 6 up-to-date

