GradleでEclipseプロジェクトを使ってみたメモ


# 環境
* Mac OS/X 10.9
* Java 1.7.0_09
* Eclipse Kepler Build id: 20130614-0229

# インストールするもの
 * Gradle 1.8 (http://www.gradle.org/)

# 導入手順
## ダウンロード/インストール
1. オフィシャル(http://www.gradle.org/)から, gradle-1.8-all.zipをダウンロード

1.  取得したバイナリを解凍し、任意の場所において gradle/binにパスを通す
## 確認

```bash:
# gradle -v 
------------------------------------------------------------
Gradle 1.8
------------------------------------------------------------

Build time:   2013-09-24 07:32:33 UTC
Build number: none
Revision:     7970ec3503b4f5767ee1c1c69f8b4186c4763e3d

Groovy:       1.8.6
Ant:          Apache Ant(TM) version 1.9.2 compiled on July 8 2013
Ivy:          2.2.0
JVM:          1.7.0_09 (Oracle Corporation 23.5-b02)
OS:           Mac OS X 10.9 x86_64

```


# eclipseプロジェクトを生成する
* ディレクトリ構成
maven的な構成ではない状況を想定。

```bash
# ll
total 8
drwxr-xr-x  3 ntakeda  staff   102 10 27 14:19 testResources //テスト時に読み込むリソースファイルを配置
drwxr-xr-x  3 ntakeda  staff   102 10 27 14:19 resources //実行時に読み込むリソースファイルを配置
drwxr-xr-x  3 ntakeda  staff   102 10 27 14:33 src // Javaソース配置
drwxr-xr-x  3 ntakeda  staff   102 10 27 15:11 test // テスト用Javaファイル配置
-rw-r--r--  1 ntakeda  staff  1070 10 27 15:12 build.gradle
```

```gradle:build.gradle
// eclipse-wtpとの連携タスク用のプラグインをロード// eclipseプラグインはeclipse-wtpに内包されているapply plugin: 'eclipse-wtp'
// ソースファイルの読み込みディレクトリの定義sourceSets {   main {      java {           srcDir 'src'      }      resources {           srcDir 'resources'      }         }   test {      java {           srcDir 'test'      }      resources {           srcDir 'testResources'      }   }}

// srcDir: 'src' って記述は gradle 2.0で消える deprecatedな構文との警告メッセージが出た

// maven公開リポジトリを取り扱えるようにするrepositories {    mavenCentral()}
// Java pluginの依存性定義dependencies {    compile (    	    ['commons-io:commons-io:2.1'],    	    ['commons-lang:commons-lang:2.6'],    )    testCompile 'junit:junit:4.+'}
```

```bash
# gradle eclipse

:eclipseClasspath
:eclipseJdt
:eclipseProject
:eclipseWtp UP-TO-DATE
:eclipse

BUILD SUCCESSFUL

Total time: 16.092 secs
```

```bash:生成されるeclipse用ファイルのパスはローカルに依存
# less .classpath
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
        <classpathentry kind="output" path="bin"/>
        <classpathentry kind="src" path="src"/>
        <classpathentry kind="src" path="resources"/>
        <classpathentry kind="src" path="testResources"/>
        <classpathentry kind="src" path="test"/>
        <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER" exported="true"/>
        <classpathentry sourcepath="/Users/ntakeda/.gradle/caches/artifacts-26/filestore/commons-io/commons-io/2.1/source/46773a62217d7f630dfe6bae0bc645bbd92ffd09/commons-io-2.1-sources.jar" kind="lib" path="/Users/ntakeda/.gradle/caches/artifacts-26/filestore/commons-io/commons-io/2.1/jar/fd51f906669f49a4ffd06650666c3b8147a6106e/commons-io-2.1.jar" exported="true"/>
        <classpathentry sourcepath="/Users/ntakeda/.gradle/caches/artifacts-26/filestore/commons-lang/commons-lang/2.6/source/67313d715fbf0ea4fd0bdb69217fb77f807a8ce5/commons-lang-2.6-sources.jar" kind="lib" path="/Users/ntakeda/.gradle/caches/artifacts-26/filestore/commons-lang/commons-lang/2.6/jar/ce1edb914c94ebc388f086c6827e8bdeec71ac2/commons-lang-2.6.jar" exported="true"/>
        <classpathentry sourcepath="/Users/ntakeda/.gradle/caches/artifacts-26/filestore/junit/junit/4.11/source/28e0ad201304e4a4abf999ca0570b7cffc352c3c/junit-4.11-sources.jar" kind="lib" path="/Users/ntakeda/.gradle/caches/artifacts-26/filestore/junit/junit/4.11/jar/4e031bb61df09069aeb2bffb4019e7a5034a4ee0/junit-4.11.jar" exported="true"/>
        <classpathentry sourcepath="/Users/ntakeda/.gradle/caches/artifacts-26/filestore/org.hamcrest/hamcrest-core/1.3/source/1dc37250fbc78e23a65a67fbbaf71d2e9cbc3c0b/hamcrest-core-1.3-sources.jar" kind="lib" path="/Users/ntakeda/.gradle/caches/artifacts-26/filestore/org.hamcrest/hamcrest-core/1.3/jar/42a25dc3219429f0e5d060061f71acb49bf010a0/hamcrest-core-1.3.jar" exported="true"/>
</classpath>
```

生成物は実行したローカルの環境にガッツリ依存する形になる。
ここは開発者ごとに生成することになるかな。

## ビルド
gradle buildで色々やってくれる。詳細は http://gradle.monochromeroad.com/docs/userguide/tutorial_java_projects.html#N106C6

```bash:ビルド
gradle build

:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar UP-TO-DATE
:assemble UP-TO-DATE
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build
```

ちなみに、jUnitが失敗した場合はこんな感じでエラーが出る。
※ 日本語のテストメソッドの出力周りがバグってるのは、環境の問題か？
     突き詰めてない。

```bash
# gradle build                               
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar UP-TO-DATE
:assemble UP-TO-DATE
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses
:test

org.nt67.FileNumberReaderTest > 失敗するテスFAILEDッド 
    java.lang.AssertionError at FileNumberReaderTest.java:17

11 tests completed, 1 failed
:test FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':test'.
> There were failing tests. See the report at: file:///Users/ntakeda/tmp/gradle/build/reports/tests/index.html

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 20.636 secs
```

実行ログに出力されているとおり、カッコイイレポートが出力されている。
![kobito.1382855390.350286.png](https://qiita-image-store.s3.amazonaws.com/0/18719/41d4c118-b335-7d0a-ae78-1369e332908d.png "kobito.1382855390.350286.png")

![kobito.1382855409.636577.png](https://qiita-image-store.s3.amazonaws.com/0/18719/687b0ba8-0b64-f7fa-78e6-50afa3a91a27.png "kobito.1382855409.636577.png")

## gradle wrapper
Gradleセットアップをするためのもの。個々の開発環境やビルド環境で個別にgradleをセットアップするのではなく、gradle wrapperを使うことでgradle環境自体も同等のものに合わせられる。

```gradle:build.gradle
task wrapper(type: Wrapper) {  gradleVersion = '1.8'}
```

```bash
# gradle wrapper
:wrapper

BUILD SUCCESSFUL

Total time: 12.384 secs

~/tmp/gradle# find gradlew
gradlew
~/tmp/gradle# find gradle  
gradle
gradle/wrapper
gradle/wrapper/gradle-wrapper.jar
gradle/wrapper/gradle-wrapper.properties
```

gradle wrapperでダウンロードされたファイルが配置されていれば、
`gradle`の代わりに `gradlew`を使うことができる。
初回実行時には、gradleのダウンロード/展開が実行される。

```bash
# ./gradlew build
Downloading http://services.gradle.org/distributions/gradle-1.8-bin.zip
..............................................
Unzipping /Users/ntakeda/.gradle/wrapper/dists/gradle-1.8-bin/vruqmccc8532n7gr46qavsii8/gradle-1.8-bin.zip to /Users/ntakeda/.gradle/wrapper/dists/gradle-1.8-bin/vruqmccc8532n7gr46qavsii8
Set executable permissions for: /Users/ntakeda/.gradle/wrapper/dists/gradle-1.8-bin/vruqmccc8532n7gr46qavsii8/gradle-1.8/bin/gradle
: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

org.nt67.FileNumberReaderTest > 失敗するテスFAILEDッド 
    java.lang.AssertionError at FileNumberReaderTest.java:17

11 tests completed, 1 failed
:test FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':test'.
> There were failing tests. See the report at: file:///Users/ntakeda/tmp/gradle/build/reports/tests/index.html

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 26.215 secs

```

![kobito.1382945294.113622.png](https://qiita-image-store.s3.amazonaws.com/0/18719/ff510dd2-1b3a-1b62-0a34-49e3b5d47ed6.png "kobito.1382945294.113622.png")


## Eclipseで使う
既存プロジェクトとしてインポートしてもそのまま使える。
gradleで定義したタスクを使うなら、pluginがあったほうが良い。

ここでは Gradle Integration For Eclipse をEclipse Market Placeから導入。

導入後はImportの形式として "Gradle Project"が追加される。
この時、`gradlew build`されていなくても、
Import時の画面からModel Buildを実行することで ecipse用の設定が生成されるのでそのままImport可能。

###  Eclipseからタスクを実行
パッケージエクスプローラからbuild.gradleで Run With を選ぶ。
Antの実行と同じようにタスクの一覧が並ぶ。