gradle + bitbucket + 社内向け (認証あり) maven リポジトリの設定手順

[Bitbucket](https://bitbucket.org/) に無料で社内向けの認証あり Maven リポジトリを作成し、gradle から利用するための手順を書く。

## 1. Bitbucket アカウント作成・リポジトリ作成

Bitbucket のアカウントを作成し、プライベートなリポジトリを作成する。
ここでは tily というユーザー名でアカウントを作成し、maven-repository というリポジトリを作成する。

なお、社内向けのプライベートリポジトリという想定なのでデフォルトでチェックされている "This is a private repository"を外さないようにする。

![](http://i.gyazo.com/59659a1e8117619bfe422ef9fb35541d.png)

## 2. gradle インストール

[第4章 Gradleのインストール](http://gradle.monochromeroad.com/docs/userguide/installation.html) に書いてある通り、Java さえインストールしてあれば、ダウンロードしてパスを通すだけで使えるようになる。

## 3. プロジェクト作成〜maven リポジトリへ公開

maven リポジトリに置く用のサンプルプロジェクトを作成。

<pre>
## ディレクトリ作成
$ mkdir java-project-a
$ cd java-project-a

## gradle init で jar プロジェクト用のひな形作成
$ gradle init --type java-library
:wrapper
:init

BUILD SUCCESSFUL

Total time: 4.469 secs
</pre>

適当なライブラリを作成する。

<pre>
$ mkdir -p src/main/java/tokyo/prgrphs/
$ vi src/main/java/tokyo/prgrphs/HelloWorld.java
</pre>

内容はこんな感じ。

<pre>
package tokyo.prgrphs;

class HelloWorld {
        public void sayHello(String name) {
                System.out.println("Hello, " + name);
        }
}
</pre>

作成したライブラリを jar にする。

<pre>
## ビルド
$ gradle jar
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar UP-TO-DATE

BUILD SUCCESSFUL

Total time: 3.988 secs

## ビルドできたことを確認
$ jar tvf build/libs/java-project-a.jar
     0 Wed Nov 26 16:33:06 JST 2014 META-INF/
    25 Wed Nov 26 16:33:06 JST 2014 META-INF/MANIFEST.MF
   330 Wed Nov 26 16:33:04 JST 2014 Library.class
     0 Wed Nov 26 16:33:04 JST 2014 tokyo/
     0 Wed Nov 26 16:33:04 JST 2014 tokyo/prgrphs/
   707 Wed Nov 26 16:33:04 JST 2014 tokyo/prgrphs/HelloWorld.class
</pre>

Bitbucket の URL や認証情報等を $HOME/.gradle/gradle.properties に書いておく。

<pre>
 $ vi ~/.gradle/gradle.properties
</pre>

中身はこんな感じ。

<pre>
bitbucketReadUrl=https://api.bitbucket.org/1.0/repositories/tily/maven-repository/raw/master
bitbucketWriteUrl=git:https://tily@bitbucket.org/tily/maven-repository.git?master#
bitbucketUsername=tily
bitbucketPassword=XXXXXXXX
</pre>

* 読み出し用の URL には bitbucket が提供している API を利用する (API とは言っても普通にユーザー名とパスワードによる BASIC 認証でアクセスできるっぽい)
* 書き込み用の URL は下記 build.gradle で利用している wagon-git というプラグインがこういう URL でないと受け付けないのでこうしている

上記の情報を利用した build.gradle を作成する。
Maven Wagon を利用して jar を git 上の Maven リポジトリに公開するためのプラグインは 2 つ見つけたが、[ar.com.synergian グループのほう](http://synergian.github.io/wagon-git/) は死んでるっぽいので [net.trajano.wagon グループのほう](http://site.trajano.net/wagon-git/) を使った。

<pre>
apply plugin: 'java'
apply plugin: 'maven'

configurations {
    deployerJars
}

repositories {
    jcenter()
}

dependencies {
    deployerJars 'net.trajano.wagon:wagon-git:2.0.1'
}

uploadArchives {
    repositories {
        mavenDeployer {
            configuration = configurations.deployerJars
            repository(url: bitbucketWriteUrl) {
                authentication(userName: bitbucketUsername, password: bitbucketPassword)
            }
            pom.groupId = 'tokyo.prgrphs'
            pom.artifactId = 'hello-world'
            pom.version = '0.0.0'
        }
    }
}
</pre>

bitbucket 上の tily/maven-repository へ jar をプッシュしてみる。

<pre>
$ gradle uploadArchives
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar UP-TO-DATE
:uploadArchives
Uploading: tokyo/prgrphs/hello-world/0.0.0/hello-world-0.0.0.jar to repository remote at git:https://tily@bitbucket.org/tily/maven-repository.git?master#
Transferring 1K from remote
Uploaded 1K

BUILD SUCCESSFUL

Total time: 23.545 secs
</pre>

ウェブから bitbucket を見てみると、うまく登録できたっぽい。

![](http://i.gyazo.com/a4bc892bacad197150ba8cf6a5548ddb.png)

![](http://i.gyazo.com/558a5c0eb0f84af14b88856b4740dfb0.png)

![](http://i.gyazo.com/6bfcf423ed1f09727b8954d355af10af.png)

## 4. maven リポジトリに公開した jar を別のプロジェクトから使ってみる

「3.」と同じようにプロジェクトのひな形を作成。

<pre>
$ mkdir java-project-b
$ cd java-project-b
$ gradle init --type java-library
</pre>

「3.」で maven リポジトリに公開した tokyo.prgrphs.HelloWorld ライブラリを利用したプログラムを書く。

<pre> 
$ vi src/main/java/tokyo/prgrphs/Main.java
</pre>

内容。

<pre> 
package tokyo.prgrphs;
import tokyo.prgrphs.HelloWorld;

class Main {
        public static void main(String[] args) {
                HelloWorld helloWorld = new HelloWorld();
                helloWorld.sayHello(args[0]);
        }
}
</pre>

build.gradle を作成。

<pre>
apply plugin: 'java'

repositories {
    maven {
        url bitbucketReadUrl
        credentials {
          username bitbucketUsername
          password bitbucketPassword
        }
    }
}

dependencies {
    compile 'tokyo.prgrphs:hello-world:0.0.0'
}
</pre>

ビルドしてみる。

<pre>
$ gradle jar
:compileJava
:processResources UP-TO-DATE
:classes
:jar

BUILD SUCCESSFUL

Total time: 7.74 secs
</pre>

ビルドできた。さらにビルドされた jar を実行してみる。

<pre>
$ java -cp ~/.m2/repository/tokyo/prgrphs/hello-world/0.0.0/hello-world-0.0.0.jar:build/libs/java-project-b.jar tokyo.prgrphs.Main tily
Hello, tily
</pre>

実行できた。

## まとめ

* bitbucket のプライベートリポジトリを使えば無料かつ手軽に社内向け Maven リポジトリをホストできる
* 今回は gradle を使ったが素の maven とか sbt とかでも似たようなことはできると思う。あと bitbucket でなく github でも似たようなことはできそう (ただし github のプライベートリポジトリは有料)
* 今回作成したプロジェクトは [tily/java-project-a](https://github.com/tily/java-project-a), [tily/java-project-b](https://github.com/tily/java-project-b) に公開した