解決すべき問題
わたしはGroovy言語で自作して junit4ks
と名付けたライブラリをMaven Centralレポジトリで公開しています。わたしが従来やっていた手順は下記の通り。
- ビルドツールGradleに組み込まれた
maven-publish
プラグインを利用してjarファイルをOSSRH Serviceにアップロード - Nexus repository manager,V2 のweb画面を手動操作してOSSRH Serviceによる検証をパスする
- 同じweb画面を操作して、最終目的地であるMaven Centralに向けてjarを手動でパブリッシュする
この手順で2025年2月にv1.6.2をパブリッシュすることができた。
この時点ではOSSRH Serviceがまだ稼働していた。
2025年7月にブラウザで https://s01.oss.sonatype.org/ を開くと下記のように警告が表示された。
2025年6月30日を最後にOSSRHが停止された。そのことはwebサイトOSSRH Sunset AnnoucementやEメールなどで事前に通知されていた。わたしは対処を怠っていた。Sonatype社が運営するCentral Portalにドキュメントがあったが、そこから自分に関係ある情報を拾い出し読み解くのがむずかしかった。サジを投げてしまったのだった。
なんとかしないといけない。
解決方法
- わたしは自作のJavaプロジェクトをビルドするのにMavenではなくGradleを使うと決めている
- OSSRH時代にわたしはGradle組み込みの
maven-publish
プラグイン を使っていた。しかしPublishing By Using a Gradle Pluginによればmaven-publish
プラグインはCentral PortalのAPIに準じていない。だからmaven-publish
プラグインはjarをCentral Portalにアップロードできない。コミュニティによって開発されたGradleプラグインでCentral PortalのAPIに準拠したものがいくつもあるから、どれかを選べとのこと - たくさんの候補の中から vanniktech/gradle-maven-publish-plugin を選択した
vanniktech/gradle-maven-publish-pluginによるパブリッシュ作業の手順
下記の説明が良かった。わたしに必要な情報が書かれていて、不要なことが書いてないから迷わなくて済んだ。
Central Portalにアクセスするためにアカウントを作る
わたしはNexus repository manager https://s01.oss.sonatype.org/ にアカウントを持っていた。そのアカウントがCentral Portalに継承されていた。もちろん新規にアカウントを作ることができる。下記のドキュメントに従え。
Namespaceを登録せよ
わたしは com.kazurayam
と io.github.kazurayam
という二つのNamespaceをOSSRH Serviceにおいて登録済みだった。それがCentraol Portalに継承されていた。
もちろん新規に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
を試してみた。正常に完了したと見えた。さて、アップロードされた成果物を目で見て確認したいと思った。
をブラウザで開いた。こんな画面が応答された。
あれ?なんだか頼りない感じだ。"HTML index view"というアンカーがあった。きっとここにわたしが投入したSnapshotsが表示されるんだろうと期待した。アンカーをクリックしてみた。そしたらこんな画面が応答された。
ああ、ダメだ。わけがわからない。
しょうがない、わかる人に訊いてみよう、と
に質問を投げた。そしたら即座に応答があった。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がなんとかしてくれるのを待つしかありませんね。疑問は解消したのでメデタシ。