Gradle で Maven Central Portal へのライブラリ公開(OSSRH Sunset を超えて)


はじめに

OSSRH(Sonatype OpenSourceSoftware Repository Hosting)は2025年6月30日でサービス終了となり、Central Publisher Portal に移行されました。

central.sonatype.org

これにより、maven-publish プラグインによるリポジトリへの公開ができなくなっています。 なので、現状ではサードパーティプラグインに頼る必要があります。

JReleaser 使っちゃうのが良いとは思いますが、ここでは gradle-maven-publish-plugin を使った、Central Portal への公開手順をまとめておきます(関連ドキュメントが点在しており分かりにくいので)。


Central Portal へのログイン

旧来の https://oss.sonatype.org/ は既に利用できなくなっています。

移行先の https://central.sonatype.com にアクセスし、右上の [Sign in] リンクをクリックしてログインダイアログを表示します。

OSSRH 利用者であればユーザが移行されているので、OSSRH のユーザ/パスワードでログインできます。

新規で作成する場合で、自身のドメインによるライブラリ公開が不要な場合は、「Continue with GitHub」でログインすれば以降のネームスペースの登録が不要になります。

公式の手順は以下になります。

central.sonatype.org


ネームスペースの登録

Maven 公開時の groupId となるネームスペースを登録します。

OSSRH 利用者であれば、既存のネームスペースが移行されているはずなので、この手順は不要です。

また、GitHub アカウントで SSO した場合は、既に io.github.<your GitHub username> のネームスペースが登録されているはずなので、このネームスペースを利用できます。なので、この手順は不要です。

ネームスペース未登録の場合は以下のダイアログが出て、ドキュメントに誘導されます。

ネームスペースの登録は、右上のユーザアイコンからメニューを開き、「View Namespace」をクリックします。

大まかな流れは以下です。

  • 「Register New Namespace」で自身のドメインを逆ドメイン名で登録
  • 「Verification Key」を取得
  • 自身のドメインの DNS TXT レコードに「Verification Key」を設定
  • 「Verify Namespace」でドメインの所有確認

詳細は以下の公式のドキュメントを参照してください。

central.sonatype.org


鍵生成と公開鍵の登録

Maven へ公開するアーティファクトはPGP(Pretty Good Privacy)で署名されている必要があります。

OSSRH 利用時に実施済みの場合は特に対応は不要です。

自身の公開鍵を持っていない場合は以下の公式ドキュメントを参考にして鍵を生成します。

central.sonatype.org

大まかな流れは以下です。

  • GnuPG をインストール
  • GnuPG で秘密鍵と公開鍵のキーペアを生成
  • 作成した公開鍵を鍵サーバへ登録
  • gradle-maven-publish-plugin で秘密鍵を利用するため、秘密鍵をエクスポート

以下も参考にしてください。

blog1.mammb.com


トークン作成

Central Portal へログインするためのトークンを作成します。

OSSRH 利用者も新たに作成する必要があります。

右上のユーザアイコンをクリックし、「View Account」から「Generate User Token」をクリックしてトークンを生成します。

詳細は以下の公式ドキュメントを参照してください。

central.sonatype.org


プラグインの設定

gradle-maven-publish-plugin の設定は以下のドキュメントに従います。

vanniktech.github.io

また、自身のプロジェクト構成により以下のドキュメントを参考にします。

vanniktech.github.io

ここでは、Java のライブラリプロジェクトの例として結論のみ記します。

~/.gradle/gradle.properties に以下を追加します。

mavenCentralUsername=<Central Portal で発行したトークンのユーザ値>
mavenCentralPassword=<Central Portal で発行したトークンのパスワード値>

signing.keyId=<鍵のID>
signing.password=<鍵のパスフレーズ>
signing.secretKeyRingFile=/<path_to_pg>/secring.gpg

mavenCentralUsernamemavenCentralPassword は、先の「トークン作成」で生成したものを指定します。

signing.* 項目は、先の「鍵生成と公開鍵の登録」の内容を指定します。


build.gradle.kts は以下のようになります。

plugins {
    `java-library`
    id("com.vanniktech.maven.publish") version "0.34.0"
}

repositories {
    mavenCentral()
}

dependencies {
    // ...
}

version = "0.0.1"
group = "<登録したネームスペース>"
base.archivesName.set("<yourlibrary>")

mavenPublishing {
    publishToMavenCentral()
    signAllPublications()
    coordinates(group.toString(), base.archivesName.get(), version.toString())
    configure(com.vanniktech.maven.publish.JavaLibrary(
        javadocJar = com.vanniktech.maven.publish.JavadocJar.Javadoc(),
        sourcesJar = true,
    ))
    pom {
        name.set("<アーティファクト名>")
        description.set("<ライブラリの説明文>")
        inceptionYear.set("2024")
        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")
                distribution.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
            }
        }
        developers {
            developer {
                id.set("<Your ID>")
                name.set("<Your name>")
                url.set("https://github.com/<username>/")
            }
        }
        scm {
            url.set("https://github.com/<username>/<yourlibrary>/")
            connection.set("scm:git:git://github.com/<username>/<yourlibrary>.git")
            developerConnection.set("scm:git:ssh://git@github.com/<username>/<yourlibrary>.git")
        }
    }
}


なお、以下のように withSourcesJar()withJavadocJar() を指定しているとエラーになります。

java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(21))
    }
    withSourcesJar()
    withJavadocJar()
}

gradle-maven-publish-plugin 側にまかせて、withSourcesJar()withJavadocJar() は削除しておきます。


公開

以下でステージング公開します。

./gradlew publishToMavenCentral

Central Portal へログインし、「View Deployments」メニュー内入り、「Publish」ボタンで公開します。

ステージング反映せず、直接公開してしまう場合は、以下のようにすることができます。

./gradlew publishAndReleaseToMavenCentral