既存のMavenプロジェクトをGradleでビルドできるようにしてみよう


# はじめに
最近、社内でMavenの勉強会があり、Gradleも話題として挙がっていました。
Mavenとの比較ができたら面白そうだったのでGradleを使い始めています。
今回の内容は既存のMavenプロジェクトをGradleに移行するやり方なので、
既にたくさんの方がやっていて目新しさはないかと思いますが・・・

# 今回の実施環境
Windows 7

# Gradleインストール
## ダウンロード&インストール
なにはともあれ、まずはGradleをインストールしましょう。
[Gradle公式](https://gradle.org/)

上記URLからDownload&Docsを選び、Complete distributionもしくは、Binary only distributionをダウンロードして好きなところに解凍します。
解凍できたらbinにPATHを通します。

## プロキシ設定
社内などプロキシ配下でGradleを実行する場合は、プロキシ設定をしてあげましょう。
Windowsの場合は、自分のアカウントディレクトリ配下に.gradleディレクトリを作り、gradle.propertiesファイルを作ります。
中身は以下のようにします。

```properties:gradle.properties
systemProp.http.proxyHost=PROXY_NAME
systemProp.http.proxyPort=PROXY_PORT
systemProp.http.proxyUser=****
systemProp.http.proxyPassword=****
systemProp.https.proxyHost=PROXY_NAME
systemProp.https.proxyPort=PROXY_PORT
systemProp.https.proxyUser=****
systemProp.https.proxyPassword=****
```

# Gradleを使えるようにする
ここからが本題です。
まずは適当なMavenプロジェクトを用意してください。

以下からの説明は、私が作ったMavenプロジェクト (https://github.com/pe-suke/filewatcher.git) 前提で書いていきます。

## pom.xmlからbuild.gradleを生成する。
pom.xmlがあるディレクトリまで移動し、おもむろに下記のコマンドを叩きます。

```bat
gradle init --type pom
```

## build.gradleの設定を書き換える。
生成されたbuild.gradleを書き換えます。
リモートリポジトリに、Mavenのセントラルリポジトリを使う場合はrepositoriesブロック内にmavenCentral()と書くだけで繋がるようになります。
今回はEclipseでプロジェクトとしてインポートできるようにeclipseプラグインとfatJarを作るためにshadowプラグインを導入します。
fatJarを作るプラグインとしてfatJarプラグインもありますが、こちらは開発停止してshadowに移行したようです。![gradle.jpg](https://qiita-image-store.s3.amazonaws.com/0/62776/457efa18-a234-4382-5e65-e31b87ba601a.jpeg)

shadowプラグインの詳しい使い方は[公式ページ](https://github.com/johnrengelman/shadow) を見て下さい。

```groovy:build.gradle
plugins {
  id 'java' 
  id 'com.github.johnrengelman.shadow' version '1.2.2'
}
apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'eclipse'

group = 'jp.gr.java_conf.pesk'
version = '0.0.1-SNAPSHOT'

description = """filewatcher"""

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
     mavenCentral()
}

dependencies {
    compile group: 'commons-lang', name: 'commons-lang', version:'2.3'
    compile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.12'
    compile group: 'ch.qos.logback', name: 'logback-classic', version:'1.1.3'
    testCompile group: 'junit', name: 'junit', version:'3.8.1'
}

shadowJar {
    manifest {
        attributes "Main-Class" : "jp.gr.java_conf.pesk.filewatcher.App"
    }
    classifier "assembly"
}

```

## Gradleビルドを実行しよう
ここまでできたら、ビルドしてみましょう。
build.gradleがあるディレクトリでgradle buildを実行します。

```bat
C:\Users\pe-suke\Documents\GitHub\filewatcher>gradle build
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar UP-TO-DATE
:assemble UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build UP-TO-DATE

BUILD SUCCESSFUL
```

成功するとbuildディレクトリにコンパイルされたソースやテスト実行結果が生成されているはずです。
ちなみに、MavenセントラルリポジトリからダウンロードしてきたjarはWindowsのデフォルトだと自分のアカウントディレクトリ配下の.gradle\cachesに配置されます。

## fatJarを生成しよう
それでは、jar単体で動くようにfatJarを生成します。
コマンドはgradle shadowです。

```bat
C:\Users\pe-suke\Documents\GitHub\filewatcher>gradle shadow
Download https://plugins.gradle.org/m2/org/jdom/jdom2/2.0.5/jdom2-2.0.5.pom
Download https://plugins.gradle.org/m2/com/github/jengelman/gradle/plugins/shadow/1.2.2/shadow-1.2.2.jar
Download https://plugins.gradle.org/m2/org/jdom/jdom2/2.0.5/jdom2-2.0.5.jar
Download https://plugins.gradle.org/m2/org/ow2/asm/asm/5.0.3/asm-5.0.3.jar
Download https://plugins.gradle.org/m2/org/ow2/asm/asm-commons/5.0.3/asm-commons-5.0.3.jar
Download https://plugins.gradle.org/m2/org/apache/ant/ant/1.9.4/ant-1.9.4.jar
Download https://plugins.gradle.org/m2/org/codehaus/plexus/plexus-utils/2.0.6/plexus-utils-2.0.6.jar
Download https://plugins.gradle.org/m2/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3.jar
Download https://plugins.gradle.org/m2/org/apache/ant/ant-launcher/1.9.4/ant-launcher-1.9.4.jar
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:shadowJar

BUILD SUCCESSFUL

Total time: 40.697 secs
```

成功するとbuild\libsディレクトリ配下にfilewatcher-0.0.1-SNAPSHOT-assembly.jarができているはずです。jar名の最後にassemblyがつくのは、build.gradleのshadowJar設定でclassifierをassemblyにしているからです。

## Eclipseにプロジェクトとしてインポートしよう
最後に、作ったGradleプロジェクトをEclipseにインポートしてみましょう。
build.gradleがあるディレクトリまで移動し、gradle eclipseと叩きます。

```bat
gradle eclipse
```

成功するとEclipseが使用するメタファイルが出来上がります。
あとは、Eclipse上でインポートするだけです。

# さいごに&感想
ざっくりとですが、ここまででMavenプロジェクトをGradleプロジェクトにすることができました。使ってみた感想は、思ったより簡単に扱えそうというイメージです。そこまで、扱うハードルは高くないかなと。
どこかの記事では、GradleはMaven + antだと書いてありましたが、確かに決められたディレクトリ構成に縛っていたり、タスク(Mavenでいうとゴール？)をgroovyで自由に書けたり、タスク順序を自由に入れ替えられる点などは間の子と言えそうです。

とはいえ、Mavenを無理にGradleにする必要はないかもしれません。
触り始めて日が浅いせいもありますが、JavaプロジェクトをビルドするだけならMavenで十分と感じました。Gradleを使うシチュエーションで考えられそうなのは、特殊なことをビルド中にMavenにやらせたいけど良さ気なプラグインがないという場合やJava以外のビルドも同時に行いたいという場合でしょうか。
Mavenプラグインは自作するのは個人的にちょっとハードルが高いので、groovyで書けてしまうGradleは利点だと思いました。

# おまけ
* gradlewがいい感じ！
MavenのpomからGradleに変換すると、勝手にgradleディレクトリやらgradlewファイルなどが生成されます。gradlewをGradleがインストールされていないマシン上で実行するとgradleコマンドと同等に使うことができます。つまりチーム開発時に生成されたgradlewを構成管理しておけば、チーム全員がいちいちコマンドをインストールしたりする必要がないわけです。開発環境をチーム全員で揃えるのは意外と時間がかかり苦労します。こういう仕組みはいいですね！

# 追記1(2015/10/05 14:30)
build.gradleの設定時に、shadowプラグインの読み込みにpluginsブロックを使って書いていますが、この書き方はGradleのバージョンが2.1.2以上でないと効きません。お使いのバージョンが違う場合は、公式に書いてあるとおり以下のように書く必要があります。

```javascript:
buildscript {
  repositories { jcenter() }
  dependencies {
    classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.3'
  }
}

apply plugin: 'java' // or 'groovy'. Must be explicitly applied
apply plugin: 'com.github.johnrengelman.shadow'
```