JavaやGroovy製のライブラリをMavenリポジトリで公開する

# 概要
Groovyのライブラリを他の言語のようにもっと気軽に公開できないかと調べててわかったことを書きます。

多くの言語ではパッケージ管理システムでライブラリを管理できます。RubyならRubyGems、Pythonならpipを使うと認識しています。(使ったことないので詳しくはわからないけど)
Java系のライブラリは通常Mavenで管理されていてOSSを公開する場としては[Maven Central Repository](http://search.maven.org/)があります。
しかしこのリポジトリは少しお堅いものなのできちんとしたOSSならともかく勝手なものは公開しにくいです。公開権限を申請するのも少しハードルが高いので難しいです。
RubyやPythonだとみんなもっと気軽に公開しているので同じようにできないかと調べて見ました。

## 余談
余談ですが何を公開したかったかというと、[groovycure](https://github.com/ligun/groovycure)というプリキュアのGroovy実装ライブラリを作ってそれを公開したかったのです。
他の言語実装だと例えば[rubicure](https://github.com/sue445/rubicure)は[RubyGems](https://rubygems.org/gems/rubicure)にあがっていて羨ましかったのでGroovyでも同じくらい簡単に使いたいなと思ったのがきっかけです。
(こんなネタライブラリをMaven Centralに上げるわけにもいかないですしね)

# 方法
## Bintrayを使用する
まず一番簡単な方法としては[Bintray](https://bintray.com/)を使う方法です。Bintrayは各種リポジトリでソフトウェアを公開できるサービスでMavenだけでなくDebianやRPMパッケージも扱えます。
このサービスを利用することで自分専用のMavenリポジトリを簡単に持つことができます。
ここに登録すると例えばGradleだとrepositoryにBintrayの自分のMavenRepositoryを登録するだけで他のライブラリと同じように使用することができます。
これだけでだいぶ便利になります。
GradleではBintrayで作成したMavenリポジトリを使用するためには次のように記述します。

```groovy
repositories {
    maven {
        url "http://dl.bintray.com/your_bintray_repository"
    }
}
```

長いURLを記述しなければならずまだイケてませんよね。
さらにGroovyのGrapeを使って書こうとすると面倒です。
そこでMavenCentralと同じ使い勝手で出来無いものかと更に調べて次の方法を知りました。

## JCenterに登録する
JCenterはMaven Centralと同じようにOSSを登録できるMavenリポジトリです。MavenCentralより敷居が低く、サービスの元がBintrayなので連携してBintrayのMavenリポジトリにおいたライブラリを更新すると自動で更新されます。
Gradleは標準でJCenterリポジトリに対応しているため、次のように記述するだけでいいです。

```groovy
repositories {
  jcenter()
}
```

JCenterリポジトリは他のOSSライブラリ使う時でも使用するため、実質的な記述量はほとんどありません。
またGrapeが標準で見に行くリポジトリでもあるので例えば私の作ったgroovycureを使用するときは次の一文を記述するだけでいいです。

```groovy
@Grab('groovycure:groovycure')
```

# 登録手順・作業
## 流れ
自作ライブラリをMavenリポジトリに公開するには次のようななれです。
1. Jarファイル作成
2. Bintrayアカウント作成
3. BintrayにMavenリポジトリを作成
4. BintrayのMavenリポジトリにパッケージを作成
5. Jarファイルを登録
6. リポジトリをJCenterに申請


## 使用ツール
上記操作をするにあたって次のツールを利用しました
* Gradle
* Firefox
MavenでなくGradleなのはGroovy使いなのとそもそもMaven殆ど使ったことなくよくわからないからです。Maven用の作業なのでMavenが慣れている人はそちらでも構いません。
Bintrayへの登録はGradleプラグインで自動登録もできるらしいのですが情報があまりなかったので、ブラウザを使って手作業でやります。

## Jarファイル作成
まずBintray(に限らずMavenリポジトリ)に登録するのには次のファイルが必要です。
* プログラム本体のJar
* JavaDocの入ったJar
* ソースコードの入ったJar
MavenやGradleではこれらの生成を簡単に行うことができます。
Gradleでの生成の仕方を説明します。
生成するためのbuild.gradleは次のようになります。

```groovy
apply plugin: 'groovy'
apply plugin: 'maven'

/* Mavenリポジトリに登録するとき必要な情報 */
archivesBaseName = 'basename' //ライブラリの名前とか
group = 'groupname'           //packageの名前とか
version = '1.0'               //バージョン

repositories {
  mavenCentral()
}

/* ビルドに使用するツール */
dependencies { 
  compile 'org.codehaus.groovy:groovy-all:2.3.2'
  testCompile 'org.spockframework:spock-core:0.7-groovy-2.0'
}

/* JavaDoc作成用のタスク */
task javadocJar(type: Jar, dependsOn: groovydoc) {
  classifier = 'javadoc'
  from groovydoc.destinationDir
}

/* Source作成用のタスク */
task sourcesJar(type: Jar) {
  from sourceSets.main.allSource
  classifier = 'sources'
}

/* Bintrayに登録するのに必要なJar */
artifacts {
  archives jar
  archives javadocJar
  archives sourcesJar
}

/* MavenプラグインのArchive作成処理に必要な情報を書く */
uploadArchives {
  repositories {
    mavenDeployer {
      repository(url: "file:${buildDir}")
      pom {
        project {
          inceptionYear '2015'
          packaging 'jar'
          licenses {
            license {
              name 'The MIT License'
              url 'http://opensource.org/licenses/MIT'
              distribution 'repo'
            }
          }
        }
      }
    }
  }
}
```

まず、Mavenプラグインが必要なためapplyします。
次にarchivesBaseNameとgroupを設定します。Mavenで言うところのartifactIdとGroupIdです。
これはそれぞれライブラリの名前とpackage名でいいと思います。
net.ligun.samplelibの場合

```groovy
archivesBaseName = 'samplelib'
group = 'net.ligun'
```

と書けます。
uploadArchives以下にMavenに必要なものを定義します。
inceptionYearやlicensesの中を書き換えて自分の設定にします。

Jarを生成するにはシェルで次のように実行します。

```
> gradle uploadArchives
```

正しく処理されるとbuild/(package)/(project)/以下に
バージョン名のディレクトリとmaven-metadata.xmlというものが生成されているはずです。

## Bintrayアカウント作成
[Bintray](https://bintray.com/)にアクセスしてアカウントを作成します。
右上の「Sign in」をクリックするとアカウント入力画面が出てくるので、そこにある「Sign up」ボタンをクリックしてアカウントを作ります。
GitHubやSNSのアカウントからでも連携できるのでそちらを使うとスムーズに進みます。

## Bintrayでパッケージ作成
アカウントを作って登録するとまずMavenやRPMなど4つのリポジトリが標準で用意されています。
今回はMavenリポジトリを使うのでクリックして中に入ります。
「Add New package」というボタンがあるのでクリックするとパッケージ作成画面が出てくるので必要な情報を入力します。
入力が終わり「Greate Package」ボタンをクリックして問題がなければパッケージが作成されます。

## ライブラリのファイルを登録
作成したパッケージを選択して中には入ります。
登録するものはバージョンごとになるのでまず新しいバージョンを作成します。
「New Version」という項目があるのでクリックします。必要項目を記述して「Create New Version」すると新しいバージョンが作成されます。
作成したバージョンを開くとファイル登録できるエリアがあるのでドラッグアンドドロップもしくはファイル選択画面より選択して登録します。
公開するのに必要なファイルは最低限下記の4つです。

* (ライブラリ名)-(バージョン).jar -> ライブラリ本体
* (ライブラリ名)-(バージョン)-sources.jar -> ソースファイル
* (ライブラリ名)-(バージョン)-javadoc.jar -> JavaDoc
* (ライブラリ名)-(バージョン).pom -> POMファイル

1で作成したGradleのbuild以下に入っているのでそれを使います。
登録が完了するとMavenやGradleからアクセスができるようになります。

## JCenterに申請
後で書く