MavenCentralRepositoryへの登録

MavenCentralRepositoryへの登録
==============================

2021.11.29 サーバが変わっていたので差分を追記


Motivation
----------
せっかくライブラリを作ったのでどこからでも使えるように登録してみようと思いました。


手順
-----
1. 事前準備
    1. Javadocとソースの生成
    1. 公開鍵の登録
    1. 署名
1. 登録
    1. チケットの作成
    1. デプロイ
    1. リリース
    1. チケットクローズ
    1. 2時間待つ


## 1. 事前準備

### 1.1. Javadocとソースの作成

ビルド時にJavadocとソースが生成されるようにします。

```xml
<build>
  ...略...
  <!-- generate source -->
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <version>2.4</version>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>jar</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

  <!-- generate javadoc -->
  <plugin>
    <groupId>org.apache.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.10.1</version>
    <configuration>
      <show>package</show>
      <source>1.7</source>
      <encoding>UTF-8</encoding>
      <docencoding>UTF-8</docencoding>
      <charset>UTF-8</charset>
      <links>
        <link>http://docs.oracle.com/javase/7/docs/api/</link>
      </links>
    </configuration>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>jar</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

  ...略...
</build>
```

Javadocコメントについて

- がんばって英語で書きます
- Java標準ライブラリのJavadocが参考になります
- 文法はGinger([http://www.getginger.jp/](http://www.getginger.jp/))でチェックできます


### 1.2. 公開鍵の登録

#### 1.2.1. 公開鍵の生成

gpgを使って生成していきます。

```console
gpg --gen-key
```

| 項目          | 設定値        |
|---------------+---------------|
| 鍵の種類      | RSA and DSA   |
| 鍵の長さ      | 2048          |
| 有効期限      | 期限なし      |
| Real name     | Tamura Shingo |
| Email address | (略)          |
| Comment       | なし          |


#### 1.2.2. 公開鍵サーバへの登録

gpgから直接登録する方法と、Web画面経由で登録する方法があります。

##### 直接登録編

```console
gpg --key-server hkp://gpg.mit.edu --send-keys XXXXX
```

##### ブラウザ経由での登録編

```console
gpg -a --export XXXX
```

出力結果を http://pgp.mit.edu に貼り付け

![Screen Shot 2014-12-04 at 01.33.15.png](https://qiita-image-store.s3.amazonaws.com/0/13469/dc502768-2569-dcb8-ef15-81e737f38392.png)

こんな感じで登録されます。


### 1.3. 署名

普通にpom.xmlに書くと、Travis CI等で実行する際に鍵がないよ！といってエラーになるので、特殊なオプションを与えたときだけ署名するようにします。

```xml
<profiles>
  <profile>
    <id>release-sign-artifacts</id>
    <!-- for release -->
    <!-- mvn -DperformRelease=true deploy -->
    <activation>
      <property>
        <name>performRelease</name>
        <value>true</value>
      </property>
    </activation>
    <build>
      <plugins>
        <!-- generate PGP Signature -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-gpg-plugin</artifactId>
          <version>1.5</version>
          <executions>
            <execution>
              <id>sign-artifacts</id>
              <phase>verify</phase>
              <goals>
                <goal>sign</goal>
              </goals>
              <configuration>
                <keyname>${gpg.keyname}</keyname>
              </configuration>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>
```

参考
http://stackoverflow.com/questions/14825039/suppressing-gpg-signing-for-maven-based-continous-integration-builds-travis-ci/14869692#14869692


## 2. 登録

### 2.1. チケットの作成

#### 2.1.1. JIRAアカウントの作成

まず、JIRAアカウントを作成します。

https://issues.sonatype.org/secure/Signup!default.jspa
に行って申請フォームを埋めます
Full Nameは自分の名前、Usernameは希望するアカウントです。
Usernameに空白を入れるとその後のスクリプトが動かないようなので、空白を入れないようにしましょう。
（一回やってしまいました・・・・）


#### 2.1.2. プロジェクトチケットの作成

https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134
に行ってチケットを発行します。

実際に発行したチケットです。
https://issues.sonatype.org/browse/OSSRH-12241


| 項目                     | 記入した値                                   | 備考                                  |
|--------------------------+----------------------------------------------+---------------------------------------|
| Summary                  | dbutils3                                     | ライブラリの名前                      |
| Description              | 略                                           | README.mdに書いた内容を１行で         |
| Group Id                 | com.github.tamurashingo                       | GitHub上に置いたので                  |
| Project URL              | https://github.com/tamurashingo/dbutils3     | README.mdでそれらしく見えるから大丈夫 |
| SCM url                  | https://github.com/tamurashingo/dbutils3.git |                                       |
| Username(s)              | なし                                         | 共同コミッターみたいな人がいれば書く  |
| Alredy Synced to Central | No                                           | 初回登録なので                        |

#### ※ 2021.11.29追記

`Group Id` に `com.github.ユーザ名` は現在は使えないようです。 `io.github.ユーザ名` を使ってくれ、とのことです。

`io.github.ユーザ名` で登録しようとすると、「githubリポジトリの所有者を確認したいから、xxxxxxというリポジトリを作ってくれ」という旨の自動コメントが出ます。
言われたとおりにリポジトリを作って一言コメントを返すと、自動で確認が入り、次に進むことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13469/2f4240e7-db4e-a2bb-db6c-32dc7c773a74.png)

↑ こんなコメントでも大丈夫でした


#### 2.1.3 settings.xml の編集 ※2021.11.29追記

`~/.m2/settings.xml` に先程作ったJIRAのアカウントとパスワードを記入します。
この情報を使って `maven` は認証します。

`id` は後述するリポジトリと同じにします。

```xml
<settings>
  <servers>
    <server>
      <id>ossrh</id>
      <username>ユーザid</username>
      <password>パスワード</password>
    </server>
  </servers>
</settings>
```



### 2.2. デプロイ
リポジトリが作成されたらメールが来ます。そうするとデプロイが可能になります。デプロイ先をpom.xmlに追加します。

```xml
<distributionManagement>
  <repository>
    <id>sonatype-nexus-staging</id>
    <name>Nexus Release Repository</name>
    <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
  </repository>
</distributionManagement>
```

#### ※2021.11.29追記

アップロード先のサーバが変わりました。

```xml
<distributionManagement>
  <snapshotRepository>
    <id>ossrh</id>
    <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
  </snapshotRepository>
  <repository>
    <id>ossrh</id>
    <url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
  </repository>
</distributionManagement>
```


おもむろにデプロイをします。

```console
mvn -DperformRelease=true deploy
```

たまーに調子が悪く、アップロードに失敗するときがありますが、やり直せば大丈夫です。

#### ※2021.11.29追記

以下のコマンドで表示されるsignatureを gpg.keyname という名前で明示的に指定しています。

```console
gpg --list-signatures --keyid--format 0xshort
```

実際に与えたコマンドはこうです。

```console
 mvn -DperformRelease=true -Dgpg.keyname=0x0EDAC573 deploy
```


### 2.3. リリース
デプロイが完了したらWeb画面からリリース作業を行います。


#### 2.3.1. ログイン

https://oss.sonatype.org/

に行き、右上の Log In を押します。
ID/PasswordはJIRAのものと同じです。

※ 2021.11.29追記

新しい方のは https://s01.oss.sonatype.org/


#### 2.3.2. リポジトリ検索
左側メニューの Build Promotion から Staging Repositories を選択します。右側の画面に自分のリポジトリが出るのでそれを選択します。

#### 2.3.3. クローズ処理
Close ボタンを押します

#### 2.3.4. リリース処理
Release ボタンが押せるようになるので、Release ボタンを押します。

デプロイ時のアップロードに失敗したりすると、失敗したリポジトリが残っていたりするため Relase ボタンが押せなかったりします。そういう時は失敗したリポジトリを選択して Drop を押し、不要なリポジトリを削除します。そうすると Release が押せるようになります。


### 2.4. チケットクローズ

JIRAのコメントにリリースした旨を記載します。そうするとJIRAがクローズされます。


### 2.5. 2時間待つ

2時間ほど待つと Central Repository と同期が取れるようなので、
http://search.maven.org/
に行って検索してみます。


![Screen Shot 2014-12-04 at 01.35.00.png](https://qiita-image-store.s3.amazonaws.com/0/13469/16f226c5-6bff-ba32-fe62-1615172621c1.png)

こういう感じで登録されます。


#### ※　2021.11.29追記

リポジトリへの反映はほぼすぐ、Searchへの反映は18時間かかりました。

## 参考

<del>OSSRH Guide
http://central.sonatype.org/pages/ossrh-guide.html
公式ガイドです</del>

The Central Repository Documentation
Getting started
https://central.sonatype.org/publish/publish-guide/


【最新版】Maven Central Repository へのライブラリ登録方法 #maven
~~http://samuraism.jp/diary/2012/05/03/1336047480000.html~~
https://yusuke.blog/2012/05/03/689
URLのリンクが切れているものがありますが、基本的にこの方法でいけました

DBUtils3
https://github.com/tamurashingo/dbutils3
自作のライブラリです。DropWizardでJDBIするときに使っています。