0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Gradleで自作したJava&GroovyライブラリをMaven Centralにパブリッシュする通り路をOSSRHからCentral Portalに移した話

Posted at

解決すべき問題

わたしはGroovy言語で自作して junit4ks と名付けたライブラリをMaven Centralレポジトリで公開しています。わたしが従来やっていた手順は下記の通り。

  1. ビルドツールGradleに組み込まれた maven-publish プラグインを利用してjarファイルをOSSRH Serviceにアップロード
  2. Nexus repository manager,V2 のweb画面を手動操作してOSSRH Serviceによる検証をパスする
  3. 同じweb画面を操作して、最終目的地であるMaven Centralに向けてjarを手動でパブリッシュする

この手順で2025年2月にv1.6.2をパブリッシュすることができた。

この時点ではOSSRH Serviceがまだ稼働していた。

2025年7月にブラウザで https://s01.oss.sonatype.org/ を開くと下記のように警告が表示された。

スクリーンショット 2025-07-17 8.14.14.png

2025年6月30日を最後にOSSRHが停止された。そのことはwebサイトOSSRH Sunset AnnoucementやEメールなどで事前に通知されていた。わたしは対処を怠っていた。Sonatype社が運営するCentral Portalにドキュメントがあったが、そこから自分に関係ある情報を拾い出し読み解くのがむずかしかった。サジを投げてしまったのだった。

なんとかしないといけない。

解決方法

  1. わたしは自作のJavaプロジェクトをビルドするのにMavenではなくGradleを使うと決めている
  2. OSSRH時代にわたしはGradle組み込みの maven-publishプラグイン を使っていた。しかしPublishing By Using a Gradle Pluginによれば maven-publishプラグインはCentral PortalのAPIに準じていない。だからmaven-publishプラグインはjarをCentral Portalにアップロードできない。コミュニティによって開発されたGradleプラグインでCentral PortalのAPIに準拠したものがいくつもあるから、どれかを選べとのこと
  3. たくさんの候補の中から vanniktech/gradle-maven-publish-plugin を選択した

vanniktech/gradle-maven-publish-pluginによるパブリッシュ作業の手順

下記の説明が良かった。わたしに必要な情報が書かれていて、不要なことが書いてないから迷わなくて済んだ。

Central Portalにアクセスするためにアカウントを作る

わたしはNexus repository manager https://s01.oss.sonatype.org/ にアカウントを持っていた。そのアカウントがCentral Portalに継承されていた。もちろん新規にアカウントを作ることができる。下記のドキュメントに従え。

Namespaceを登録せよ

わたしは com.kazurayamio.github.kazurayam という二つのNamespaceをOSSRH Serviceにおいて登録済みだった。それがCentraol Portalに継承されていた。

image.png

もちろん新規にNamespaceを登録することも可能だ。下記のドキュメントに従え。

GPGキーを準備する

自作したjarをCentral Portalに転送する時に公開鍵で暗号化することが要求される。そのためにGnuPGというツールを使う。詳しくは下記のドキュメントを参照。

個人情報を ~/.gradle/gradle.properties ファイルに書く

publish操作をするときにSonatype OSS credentialsとsigning GPG keyを教える必要がある。それらをプロジェクトのファイルに書いてGitレポジトリに含めると、個人情報を他人の目に晒してしまう危険がある。だからGitレポジトリの外に保管すべきだ。わたしは自分のマシンの ~/.gradle/gradle.properites ファイルに書いた。

~/.gradle/gradle.properties

mavenCentralUsername=<username>
mavenCentralPassword=<the_password>

signing.keyId=<12345678>
signing.password=<some_password>
signing.secretKeyRingFile=/Users/<yourusername>/.gnupg/secring.gpg

<>に囲まれた箇所には自分自身の適切な値を指定する必要がある。

ここで mavenCentralUsername とか signing.keyId といったプロパティ名を指定している。vanniktech/gradle-maven-publish-plugin がこういう名前のプロパティを期待しているから、それに従った。違う名前のプロパティではプラグインが認識しない。

build.gradleを書く

vanniktech/gradle-maven-publish-pluginを使ってjarをMaven Centralに送り込むのに必要なコードをbuild.gradleファイルに書いた。

要点を述べる。

pluginを宣言する

// build.gradle
plugins {
    id 'groovy'
    id 'com.vanniktech.maven.publish' version '0.34.0'
}

versionを宣言する

// build.gradle
group = "com.kazurayam"
version = "1.6.3"

プラグインに対してさまざまの情報を与える

mavenPublishing {
    publishToMavenCentral()
    signAllPublications()

    coordinates(project.group,              // com.kazurayam
                project.rootProject.name,   // junit4ks
                project.version)            // e.g, g1.6.3 or 1.6.3-SNAPSHOT

    pom {
        name.set(project.rootProject.name)
        description.set('A Katalon Studio plugin that enables running JUnit4 tests for Custom Keyword classes')
        inceptionYear.set('2019')
        url.set("https://${GitHubUserName}.github.io/junit4ks/")
        licenses {
            license {
                name.set('The Apache License, Version 2.0')
                url.set('https://www.apache.org.licenses/LICENSE-2.0.txt')
                distribution.set('http://www.apache.org/licenses/LICENSE-2.0.txt')
            }
        }
        developers {
            developer {
                id.set("${GitHubUserName}")
                name.set('URAYAMA,kazuaki')
                url.set("https://github.com/${GitHubUserName}/")
            }
        }
        scm {
            connection = "scm:git:https://github.com/${GitHubUserName}/${project.rootProject.name}.git"
            developerConnection = "scm:git:git@github.com:${GitHubUserName}/${project.rootProject.name}.git"
            url = "https://github.com/${GitHubUserName}/${project.rootProject.name}"
        }
    }
}

Central Portalにjarを送り込みMaven Centralにパブリッシュする

$ gradle publishToMavenCentral

これでできた。

Central Portalにアップロードした -SNAPSHOT が見られないぞ問題

https://github.com/vanniktech/gradle-maven-publish-plugin/blob/main/docs/central.md こう書いてあった。

Publishing snapshots

Snapshots can be published by setting the version to something ending with -SNAPSHOT and then running the following Gradle task:

./gradlew publishToMavenCentral

The snapshot will be automatically available in the Central Portal snapshot repository directly after the task finished.

build.gradleの中で

mavenPublishing {
    ...
    coordinates(project.group,              // com.kazurayam
                project.rootProject.name,   // junit4ks
                project.version)            // e.g, g1.6.3 or 1.6.3-SNAPSHOT

と書いてるところ、例えば 1.6.3-SNAPSHOT のように -SNAPSHOT という文字列で終わる値を project.version プロパティの値として指定してやれば、それだけで Central Portalの中で Snapshotsと呼ばれる特殊なディレクトリにjarを放り込むことができる。Maven Centralレポジトリは本番の舞台みたいなもので、上書きや変更・削除が許されないのだが、Central PortalのSnapshotsでは何度でも上書きすることが許されている。Snapshotsは稽古場のようなものなのだろう。

わたしもversion=1.6.3-SNAPSHOTと指定して$ gradle publishToMavenCentral を試してみた。正常に完了したと見えた。さて、アップロードされた成果物を目で見て確認したいと思った。

をブラウザで開いた。こんな画面が応答された。

image.png

あれ?なんだか頼りない感じだ。"HTML index view"というアンカーがあった。きっとここにわたしが投入したSnapshotsが表示されるんだろうと期待した。アンカーをクリックしてみた。そしたらこんな画面が応答された。

image.png

ああ、ダメだ。わけがわからない。

しょうがない、わかる人に訊いてみよう、と

に質問を投げた。そしたら即座に応答があった。Central Portalのサポートチーム曰く

Due to a bug with the underlying service we rely on to provide snapshot hosting, we've had to temporarily remove browse access for snapshot releases. This is related to the recent outage earlier in the months. You should still be able to publish and consume releases as usual, but you cannot browse them via the UI.

基盤システムにちょっと問題があってSnapshotsをブラウザで見ることが今はできない。でもSnapshotをパブリッシュすることは問題なくできる、とのこと。ならばThe Central Teamがなんとかしてくれるのを待つしかありませんね。疑問は解消したのでメデタシ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?