Maven Central へライブラリを公開する
Maven CentralとはJavaおよびJVM系言語向けの最大級の公開リポジトリです。
作成したJavaライブラリを公開し、共有することができます。今回、その手順を学習したため共有します。
前提
- 公式ページのサンプルが多いなどの理由でビルドツールはMavenを利用します
以下の記事内容は基本的に公式のページに従っているだけです。
手順
Maven Centralにサインイン
アカウントを作成します。学習目的であれば GitHub ログインが便利です。GitHub ログインの場合は io.github.xxx の Namespace が自動で利用できます。
Namespace の申請
GitHub ログインの場合は不要ですが、自分の独自ドメインを使いたい場合は公式ドキュメントに従って設定します(DNS の TXT レコード設定が必要になります)。
Publish 基準を満たすための Maven 設定
Maven Central へ公開するには、次を満たす必要があります。
- Javadoc と Sources の添付
- チェックサム
- メタデータ(groupId, artifactId, version, description, license, developer, SCM)
- GPG 署名
Javadoc や Sources の添付、メタデータは pom.xml に次のように記述します。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 各種メタデータここから -->
<groupId>io.github.shigaichi</groupId>
<artifactId>mvn-release-study</artifactId>
<version>0.0.4-SNAPSHOT</version>
<name>mvn-release-study</name>
<description>JavaライブラリをMaven Centralへ公開するための練習用プロジェクト</description>
<url>https://github.com/shigaichi/mvn-release-study</url>
<licenses>
<license>
<name>Apache License, Version 2.0</name>
<url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
</license>
</licenses>
<developers>
<developer>
<id>shigaichi</id>
<name>shigaichi</name>
<email>example@users.noreply.github.com</email>
<url>https://github.com/shigaichi</url>
</developer>
</developers>
<scm>
<connection>scm:git:https://github.com/shigaichi/mvn-release-study.git</connection>
<developerConnection>scm:git:git@github.com:shigaichi/mvn-release-study.git</developerConnection>
<url>https://github.com/shigaichi/mvn-release-study</url>
<tag>HEAD</tag>
</scm>
<!-- 各種メタデータここまで -->
<build>
<plugins>
<!-- maven-source-plugin、maven-javadoc-pluginプラグインを追加するとdeploy時にsource、javadocを追加してくれます -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.6.3</version>
<configuration>
<source>${maven.compiler.release}</source>
<doclint>none</doclint>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- Mavenでライブラリをパブリッシュする際に必要です。パブリッシュ時にファイルのチェックサムも自動で追加してくれます -->
<plugin>
<groupId>org.sonatype.central</groupId>
<artifactId>central-publishing-maven-plugin</artifactId>
<version>0.9.0</version>
<extensions>true</extensions>
<configuration>
<publishingServerId>central</publishingServerId>
<autoPublish>true</autoPublish>
</configuration>
</plugin>
<!-- 以下略 -->
GPG 署名
Maven Central では GPG 署名が必須です。
まず GPG 鍵を作成します(gpg は Linux では標準でインストール済みのことが多いですが、macOS や Windows では別途インストールが必要です(Homebrew や Gpg4win)。)
gpg --gen-key
作成された鍵は次で確認できます。
gpg --list-keys
次に、公開鍵をキーサーバーへ送信します。公開鍵はその名の通り公開するものなので送信しても問題ありません。
send-keysにはgpg --list-keysの結果のpub部分に含まれる英数字を設定します。
gpg --keyserver keyserver.ubuntu.com --send-keys CA925CD6C9E8D064FF05B4728190C4130ABA0F98
ここまでで準備完了のため次はMavenでライブラリビルド時にファイルに署名するプラグインを追加します。次の設定をpom.xmlに追加します。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
Maven は内部で gpg コマンドを呼び出し、デフォルトの秘密鍵(gpg が自動選択する鍵)を使って署名します。
gpg-agent が動いていれば、settings.xml にパスフレーズを書く必要はありません。
トークンの作成
Maven Central に公開するにはトークンが必要です。
ここで生成した username と password を settings.xml に設定します。
settings.xml について
通常は ~/.m2/settings.xml を使用します。ファイルがなければ作成してください。
<settings>
<servers>
<!-- Maven Centralでトークンを作成したときのusernameとpassword -->
<server>
<id>central</id>
<username>xxx</username>
<password>yyyy</password>
</server>
</servers>
</settings>
パブリッシュ
mvn deploy
これだけでビルドから署名、Maven Central への公開まで一括で行われます。
一度公開した通常バージョンは上書きできません。
SNAPSHOT のパブリッシュ
Maven Central そのものでは *-SNAPSHOT の公開はできませんが、
Central Portal が提供する maven-snapshots リポジトリには公開できます。
まずはNamespacesのページでSNAPSHOTパブリッシュしたいNamespaceについてEnable SNAPSHOTsします(私の画像では有効化済みです)
その後、version に -SNAPSHOT をつけて mvn deploy するだけで、
central-publishing-maven-plugin が通常版と SNAPSHOT を自動で振り分けてくれます。
SNAPSHOT は何度でも上書きできます(90日で削除されます)。
利用する場合は設定の追加が必要です。Gradleの場合build.gradleを次のようにします。
repositories {
// mavenCentralに加え以下を追加
maven {
name = 'Central Portal Snapshots'
url = 'https://central.sonatype.com/repository/maven-snapshots/'
// 以下のライブラリのみSNAPSHOTリポジトリから探す設定。なくても良い
content {
includeModule("<the snapshot's groupId>", "<the snapshot's artifactId>")
}
}
mavenCentral()
}
例
私がパブリッシュに成功したリポジトリです。参考になるかもしれません。
こちらでパブリッシュされていることを確認できます。
