新米エンジニアがMaven Central Repository に自作ライブラリを公開してみた

エンジニア歴半年の自分がMaven Central Repositoryに自作ライブラリを初めて登録・公開してみました。
ちょくちょく詰まったところがあったので、その軌跡を残しておこうと思います。

自分と同じく初心者の方がライブラリ公開をするときの手助けになればと。。。

以下のリンクを主に参考にしました。

- https://blog.tagbangers.co.jp/2015/02/27/to-register-the-source-code-that-was-published-in-github-to-maven-central-repository
- https://tagomoris.hatenablog.com/entry/20141028/1414485679


## 0. ことの始まり
そもそもなんで歴の浅い自分がいきなりライブラリ公開をしてみたのかって話。
業務上Maven Central Repositoryにライブラリをアップしたり更新したりする必要に迫られたのです。
しかし、知識・経験不足の自分は、
「Maven Centralっていろんなライブラリが置いてあって、gradleとかで使いたい
ライブラリとか引っ張れるところでしょ。そこに簡単にライブラリを載せられるの？」
みたいな状況でした。。。

そんな状況でいきなり業務でいじるのは危なすぎる（汗）
だから、自分で一旦やってみようってことです。

なので、この記事は 

- Maven Centralってライブラリがたくさんある場所だよね
- javaは最低限書けて、ライブラリは作れるよ 
- githubでの基本的なことはできる

ということだけ事前に知っていれば分かるように書こうと思います。

厳密には違ったり、何か間違いがあれば教えて下さいませ。



## 1. ライブラリの作製
まずは各々自分が公開したいライブラリを作成して、githubに公開してください。

最初は
「全世界の人が使えるものだからすごいものじゃなきゃだめなのかな」
とか思いましたが、別にどんなライブラリでも公開して大丈夫みたいです。（もちろん悪意のあるものはダメ）

僕が公開したものは以下のものです。
https://github.com/yutwoking/randomJapanLocationer
47都道府県名と都道府県番号をランダムで返してくれるというシンプルなものです。
~~そんなの誰が使うんだよっ！！！！！~~

これくらい簡単なものでもMaven Central Repositoryに公開できるってことです。笑

余談にはなりますが、自分ひとりでwebサーバーを立ち上げてwebアプリケーションを公開したことがないので、後日この公開したライブラリを利用して、簡単なwebアプリをリリースしてみたいと思います。

## 2.Sonatype JIRAでアカウント作製
Maven Central Repositoryにライブラリ公開するためには、Sonatype JIRAで申請をする必要があるので、まずはアカウント登録します。
申請が通れば、sonatype OSSRHにデプロイでき、それがMaven Central Repositoryに公開される。
登録は難しいことはなにもなく、項目を埋めるだけ。
https://issues.sonatype.org/secure/Signup!default.jspa
設定で日本語も選べます。
ここはサクサク進めます。

## 3.プロジェクト申請を行う
次にライブラリ公開のプロジェクト申請を行います。
sonatypeのページトップ上部の作成をクリックすると、申請フォームが現れます。

![スクリーンショット 2019-09-19 10.27.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499775/12c11061-cd3f-3aea-8c39-bfe6c4160662.png)

それぞれの項目を以下のように埋めていきます。
審査をしてくれるのは外国の方なので、英語で書きます。

- **プロジェクト**：Community Support - Open Source Project Repository Hosting (OSSRH)
- **課題タイプ**：New Project
- **要約**：公開するライブラリのプロジェクト名を入力。要はライブラリの名前なので分かりやすいものを付ける。
- **説明**:ライブラリの内容説明を記入します。必須ではないので、入力しなくてもOK。ただ、沢山の人に使ってもらいたいのなら入力するべき。自分は空欄でした。
- **添付ファイル**:特にいじらなくてOK
- **GropId**:自分のライブラリをアップロードするパッケージの名前空間を入力。素人の自分はここで引っかかったので後で後述。
- **ProjectURL**:ライブラリを公開したgithubのURLを入力
- **SCMurl**：該当githubリポジトリのcloneURL入力。
- **Username(s)**：他の人と指定した Group Id に対して権限を共有したい場合はここに Sonatype JIRA のアカウント名を書く。一人でやっているのなら空欄で大丈夫。
- **Already Synced to Central**：No

記入して作成を押すと、プロジェクトページができて審査に移る。
![スクリーンショット 2019-09-19 10.52.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499775/98ad224a-00b5-b287-b7e6-1c784df6f569.png)

しばらくして、問題がなければ、申請が通り、次の手順にすすめるはず。
しかし、以下のコメントがプロジェクトページに届く。
![スクリーンショット 2019-09-19 11.00.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499775/4889f7d8-897a-7ad6-4d6b-6984dfab014b.png)

申請が通らない。。。
理由は、**GroupIdが適切でない**とのこと。

申請するときに、名前空間だからかぶらなければいいんでしょ？くらいにしか考えてなかった自分は、「com.yutwoking」とテキトーに書いて申請してしまっていたのです。
しっかりとコメントに対処方が書いてあって助かりました。
~~botが定形文を返しているだけかもしれないが~~担当者ありがとう＼(^o^)／

Githubに公開している場合は、
io.github.{ユーザ名} か com.github.{ユーザ名}
というGroupIdを使用すればいいみたいです。

プロジェクト画面の上部に編集ボタンがあるので、そこでGroupIdを直します。
そして、直したことを担当者に報告するコメントを送ります。
（コメントをしないと担当者に修正が伝わらないみたいなので要注意）
![スクリーンショット 2019-09-19 11.08.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499775/6e319bc9-e86d-be5c-5d59-475d0473fb7c.png)
そして、しばし待つ。
また数時間後に担当者からコメントが来る。
![スクリーンショット 2019-09-19 11.12.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499775/f1a38be6-15fc-c382-7ea9-a408307d7288.png)
どうやら、本当に自分のgithubのアカウントなのかの証明が必要らしい。
言われたとおりに、OSSRH-51643というリポジトリを作成して、コメントを返す。
![スクリーンショット 2019-09-19 11.17.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499775/c0c8a496-d8c1-ccfd-d4ca-9e200d53b455.png)
またしばし待つ。
以下のようにコメントがきて、無事、申請完了！
![スクリーンショット 2019-09-19 11.19.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499775/ac3a2807-eb89-37bc-7a21-44c60971f85b.png)
初回リリース終わったらコメントくださいとのことが最後に書いてある。

## 4. Maven Central Repositoryに登録するためのpom.xmlを作成
Mavenを普段使用しているのならば、書いているはずのpom.xml。
しかし、僕は普段gradleを使用しているので、ここでも大苦戦でした。

一応、gradleを利用しても登録できるようです。
https://tagomoris.hatenablog.com/entry/2016/02/16/114226

ただ、せっかくMaven Centralに公開するのだから、Mavenでやってみたいじゃん。
ということで、pom.xmlを書きます。

僕が書いたpom.xmlはこちら
https://github.com/yutwoking/randomJapanLocationer/blob/master/pom.xml

公式が出しているpom.xmlはこちら
https://github.com/simpligility/ossrh-demo/blob/master/pom.xml

このpom.xmlに不備があると、リリースする際にエラーになります。
ぼくが書いたものと公式を見比べると、どこを編集したらいいのか分かりやすいと思います。
自分は何回もここでつまずきました（泣）
つまずきポイントはリリースの項目で書いていきます。

## 5.GPG鍵のセットアップ
### 鍵の準備
ライブラリ公開のためには、GPG鍵での署名が必要らしい。
自分はmacのため、以下のソフトをまずはインストール。
https://gpgtools.org/

※windowsの方は以下の公式ドキュメント参照
https://central.sonatype.org/pages/working-with-pgp-signatures.html

次に、ターミナルを開いて、以下のコマンドを実行していく。
（実行できない場合、ターミナルを再起動するか、gpg2→gpgにして試してみる。）

まずは鍵の生成。コマンド入力後、指示に従って進めればOK

```
$ gpg2 --gen-key
```

次のコマンドで鍵が生成できているか確認

```
$ gpg2 --list-keys

/Users/Ehara/.gnupg/pubring.kbx
-------------------------------
pub   rsa2048 2019-09-18 [SC] [有効期限: 2021-09-17]
      BDCD77306BCE8473BBFC69521697094FBD6EAK76
uid           [  究極  ] Yuto Ehara <****@gmail.com>
sub   rsa2048 2019-09-18 [E] [有効期限: 2021-09-17]
```

鍵が作成できていたら、以下のコマンドでサーバに公開鍵を送る。
--send-keysの値は↑で確認した公開鍵の値を入れること

```
$ gpg2 --keyserver hkp://pool.sks-keyservers.net --send-keys BDCD77306BCE8473BBFC69521697094FBD6EAK76
```

### 鍵を使用するためのMaven設定
Sonatype OSSRH にデプロイできるように、settings.xmlというファイルをローカルに置く必要がある。
ユーザごとにある、読み込まれるディレクトリが違うらしい。
文献を見る限り、~/.m2/settings.xml に置けば読みこまれることが多い。
自分もここに作成してうまくいった。

settings.xmlの内容は以下のようにする。

```settings.xml
<settings>
  <servers>
    <server>
      <id>ossrh</id>
      <username>YOUR_JIRA_USERNAME</username>
      <password>YOUR_JIRA_PASSWORD</password>
    </server>
  </servers>
  <profiles>
    <profile>
      <id>ossrh</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
        <gpg.executable>gpg2</gpg.executable>
        <gpg.passphrase>GPG_KEY_PASSPHRASE</gpg.passphrase>
      </properties>
    </profile>
  </profiles>
</settings>

```
YOUR_JIRA_USERNAME, YOUR_JIRA_PASSWORD はJIRAアカウント作成時の自分のもの。
GPG_KEY_PASSPHRASE は先程鍵作成時に自分が設定したもの。
これで、maven起動時にファイルを呼んでくれる。

## 6. Sonatype OSSRH にデプロイ
以下のコマンドでデプロイを実行する。

```
$ mvn clean deploy -DperformRelease=true
```
問題がなければ、BUILD SUCCESSと出るはず。
出ない場合はエラーメッセージを見て、修正。

自分の場合は以下の間違いでエラーがでたので、エラーがでたら参考にしてみてください。

- コンパイルのjavaバージョンが適正でない。  
→pom.xmlの以下の部分の\<source>タグと\<target>タグを適切に変える。

```
<plugin>
	<artifactId>maven-compiler-plugin</artifactId>
	<configuration>
		<source>12</source>
		<target>12</target>
		<encoding>UTF-8</encoding>
	</configuration>
</plugin>
```

- プラグインのversion
→参考文献が古いとプラグインのversionが古くうまく動作しない場合がある。  
https://mvnrepository.com/repos/central  
で調べて最新のversionにpom.xmlを書き換えておくと良い。

## 7. Sonatype OSSRH でリリース
デプロイが完了したら、いよいよリリース作業。

まずは、sonatype OSSRHにログインします。
ログイン時のusernameとpassはJIRAアカウントのものです。
https://oss.sonatype.org/ 

ログイン後、画面左のBuild Promotion > Staging Repositories をクリックすると、stagingされているrepository一覧が表示されます。
deployがうまくいっていれば、ここに自分のものがあるはず。
![スクリーンショット 2019-09-19 16.12.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499775/57477e11-c999-25af-2c2e-d37ca75e760a.png)
自分のものを選択して、closeする。
closeすると、いろんなチェックが走るのでしばらく待ちます。
closeがうまくいけば、あとはReleaseボタンを押すだけです。
closeが失敗した場合、エラーの出ているリポジトリをDropして、エラー修正した後、もう一度デプロイからやり直してください。

僕はエラーまみれだったので、僕が経験して直したエラーをご紹介。

###公開鍵が見つからないというエラー  
公開鍵をサーバーに登録して時間があまりたっていないと、同期の関係でエラーが出るらしい。数時間待ってからもう一度やったらエラー解消できました。

参考
https://codeday.me/jp/qa/20190129/197488.html
###pom validation エラー  
pom.xmlのタグ漏れによって起こるエラーです。
以下のタグを含んで（これらのタグの子供タグも漏れなく）、もう一度デプロイする。

- name
- groupId ←申請時に記入したもの
- artifactId
- version
- description
- url
- licenses
- scm
- developers

あと、nameタグとartifactIdタグを同じにしないとエラーが出るみたいなので注意。

### pom 以外のvalidation エラー
pom.xmlに適切なプラグインを入れる。
例）javadoc validation エラーの場合、maven-javadoc-pluginを入れる。

参考
https://web-dev.hatenablog.com/entry/maven/central/nexus-close-error

### 無事closeできたら
あとは、Releaseを押すだけで完了です＼(^o^)／
Maven Central Repository に反映されるまで数時間かかるので待ちましょう。

## 8. 公開できたのを確認する
http://search.maven.org/ 
でgropIdを検索すれば、自分の公開したリポジトリが見つかるはず！
![スクリーンショット 2019-09-19 16.37.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499775/bc79dd20-84e9-8cf2-e2f4-58560bd6d373.png)

## やってみた感想
初回は色々手続きがめんどくさく、時間がかかってしまったが、次回以降はぱぱっとできそう。
gradleでのリリース作業も、今度やってみようと思います。

何か間違いがあれば教えて下さいm(_ _)m