GitHubにMavenリポジトリを作ってしまってライブラリを公開してしまおう

Javaは作ったライブラリをどうやって配布するか悩みの種です。jarファイルを作って読み込むのもダサいし、
Maven Centralに登録するのもハードル高そうだし、どうせならそのままGitHubで公開したいです。

[maven-plugins](https://github.com/github/maven-plugins)を使えばGitHubに置いて公開できるっぽかったのでやってみました。


## HomeBrewで入れてるmavenは``3.3.9``
```bash
$ mvn -v
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T01:41:47+09:00)
Maven home: /usr/local/Cellar/maven/3.3.9/libexec
Java version: 1.8.0_73, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.11.4", arch: "x86_64", family: "mac"
```

## access tokenを作る
https://github.com/settings/tokens でdeployで使用するaccess tokenを作成します。
repoの権限にチェックが入っていれば大丈夫なはず


# 認証情報を設定

認証情報はコミットしたくないのでローカルで管理
``$vim ~/.m2/settings.xml``

```xml:~/.m2/settings.xml
<settings>
  <servers>
    <server>
      <id>github</id>
      <username>username@example.com</username>
      <password>abcdefghijk（access tokenをいれる）</password>
    </server>
  </servers>
</settings>
```

passwordには普通にパスワード入れるって書いてあったけど、うまく動作しなかったのでさっき取得したaccess tokenを入れる


## pom.xmlの設定

```xml: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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>holiday-jp</groupId>
    <artifactId>holiday-jp</artifactId>
    <!-- バージョン番号 -->
    <version>1.0</version>
    <packaging>jar</packaging>

    <name>holiday-jp</name>
    <url>https://github.com/narikei/holiday-jp</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!-- 認証情報読み込み -->
        <github.global.server>github</github.global.server>
    </properties>

    <distributionManagement>
        <repository>
            <id>internal.repos</id>
            <name>Temporary Staging Repository</name>
            <url>file://${project.build.directory}/mvn-repo</url>
        </repository>
    </distributionManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>com.github.github</groupId>
                <artifactId>site-maven-plugin</artifactId>
                <version>0.12</version>
                <configuration>
                    <!-- Git コミットメッセージ -->
                    <message>Maven artifacts for ${project.version}</message>
                    <noJekyll>true</noJekyll>
                    <!-- distributionManagement の url と一致させる -->
                    <outputDirectory>${project.build.directory}/mvn-repo</outputDirectory>
                    <!-- リモートブランチ名 -->
                    <branch>refs/heads/mvn-repo</branch>
                    <includes><include>**/*</include></includes>
                    <!-- Github リポジトリ名 -->
                    <repositoryName>${repositoryName}</repositoryName>
                    <!-- Github リポジトリユーザー名 -->
                    <repositoryOwner>${ownerName}</repositoryOwner>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>site</goal>
                        </goals>
                        <phase>deploy</phase>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
```

リポジトリ名、リポジトリユーザー名などを設定、versionは後で設定するtag名と合わせる必要があります。
この設定でmvn-repoブランチにアップロードされるようになります。


## デプロイ実行

```bash
$ mvn clean deploy
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building holiday-jp 1.0
[INFO] ------------------------------------------------------------------------
[INFO] 

・
・
・

[INFO] Updating reference refs/heads/mvn-repo from a1d4648e3aa42b6cf247614fd38379ed0ae37a9d to c4cc9eee11adafa0f2de71eae88ee9c83f1647d1
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 38.698 s
[INFO] Finished at: 2016-05-12T12:25:24+09:00
[INFO] Final Memory: 20M/218M
[INFO] ------------------------------------------------------------------------
```


## versionをタグ付け

pom.xmlで指定したversionを、デプロイのコミットにtag付します

```bash
$ git tag 1.0 c4cc9eee11adafa0f2de71eae88ee9c83f1647d1
$ git push origin 1.0
```


## 出来上がったのがこちらです
https://github.com/narikei/holiday-jp
https://github.com/narikei/holiday-jp/blob/master/pom.xml にmavenの設定が入っています
https://github.com/narikei/holiday-jp/tree/mvn-repo にデプロイされたファイルが入っています


## 使う側からライブラリを読み込むときは

```xml: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/xsd/maven-4.0.0.xsd">
    <repositories>
        <repository>
            <id>holiday-jp</id>
            <url>https://raw.github.com/narikei/holiday-jp/mvn-repo/</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>holiday-jp</groupId>
            <artifactId>holiday-jp</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
</project>
```

urlを``https://raw.github.com/${ownerName}/${repositoryName}/${branchName}/``という形式で読み込んでくれます
versionにはつけたtag名を入力します


## おわり
npmとかRubyGemsとかに慣れきっててJava辛いけど、
適当なオレオレライブラリ作るにはこれで結構便利かも


### 参考
http://oinume.hatenablog.com/entry/wp/527
http://yo1000.hateblo.jp/entry/2015/03/18/030358