Gradleを使ったWebアプリケーションのさくさく開発(セットアップ編)

IvyやMavenもまともに使ったことはないですが、Gradleを使いはじめました。

目標と前提条件

Gradleがどこまで面倒見てくれるかは何も考えずに立てた条件がこちらの通りです。

  • Jettyで動作する実行可能なWAR(java -jar sample-app.war -p 8080みたいな形で)を作成したい。
    もちろん、WARなので、そのままデプロイしても使える。
  • WARの作成、テスト(ユニットテストや性能テストなどカテゴリ別に指定出来れば理想)、デプロイは最低限タスクとして実行できるようにする。
  • Checkstyle, FindBugs, Coberturaを使った静的解析結果をレポートする。結果はJenkinsから参照できるようにする。
  • 開発はEclipse 3.7。
  • 依存するライブラリには、Mavenリポジトリに存在しない独自jarも含む。
  • Java EE

とりあえずこんなところ。少しずつ追記していくかも。Gradleの魅力を知るのに適切なシンプルな条件だと思うので、少しずつ使いながら、プラクティスとしてまとめていきたいと思います。

プラグインインストール

更新サイト http://dist.springsource.com/release/TOOLS/gradle からGradleプラグインをインストール。

プロジェクトの作成

プロジェクト名「gradle-sample」として、Gradleプロジェクトを作成。sample projectは「Java Quickstart」としました。

ただし、慣れたプロジェクト構成にするために、.classpathと.projectを編集して、ディレクトリを整えます。

.classpath

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src/main/java"/>
    <classpathentry kind="src" path="src/main/resources" />
    <classpathentry kind="src" path="src/test/java"/>
    <classpathentry kind="src" path="src/test/resources"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    <classpathentry exported="true" kind="con" path="org.springsource.ide.eclipse.gradle.classpathcontainer"/>
    <classpathentry kind="output" path="bin"/>
</classpath>

.project

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
    <name>gradle-sample</name>
    <comment></comment>
    <projects>
    </projects>
    <buildSpec>
        <buildCommand>
	    <name>org.eclipse.jdt.core.javabuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
    </buildSpec>
    <natures>
        <nature>org.springsource.ide.eclipse.gradle.core.nature</nature>
        <nature>org.eclipse.jdt.core.javanature</nature>
        <nature>org.eclipse.jdt.groovy.core.groovyNature</nature>
    </natures>
</projectDescription>

以下の様な見慣れた構成になります(Mavenプロジェクトはほとんど未経験ですが、Antでビルドしていたプロジェクトの時も構成はMavenっぽくしていたのです)


build.gradleのカスタマイズ

デフォルトで作ったGradleプロジェクトで作られたbuild.gradleに対して、まず最低限必要な追記をしていきます。

リポジトリの設定

repositories {
    mavenLocal()
    maven {
        url "http://maven.seasar.org/maven2"
    }
    mavenCentral()
}

Seasar2を使うので、Seasar2Mavenリポジトリを指定。上から順に見つかるまで探すから、この順に指定すれば一番無駄がない(と思います…)。

エンコーディングの設定

def defaultEncoding = 'UTF-8'
compileJava {
    options.encoding = defaultEncoding
}
compileTestJava {
    options.encoding = defaultEncoding
}

ここによると、↓でもできるみたい。

def encoding = { it.encoding = 'UTF-8'}

Eclipse(IDE)での使い方

すべてリフレッシュ

build.gradleにはeclipseプラグインを使うように記述

apply plugin: "eclipse"

build.gradleの記述ミスやなんやかんやとエラーはよく起きるので、最初のうちは、build.gradleを修正するたびに、[Gradle]-[すべてリフレッシュ]を行うように心がけました。

記述が間違って依存関係を解決できずコンパイルに失敗したり、そういうミスをしている場合にエラーになります。

うまくいっていると依存性のあるライブラリをEclipseのビルドパスに通してくれます。ライブラリのダウンロード先はユーザディレクトリの下の.gradle\.cachesの下みたい。


はじめのうちによく使うタスク

Antの時は、過去のプロジェクトで使ったbuild.xmlを秘伝のタレのように使いまわしていましたが、基本的なタスクはすべて用意されており、自分で作りこむ必要はないです。

なので、よく使いそうなタスクから覚えていきます。

  • test
    • テストを実行。結果はbuild/reports/tests(HTML), build/test-results(XML)の下。
  • clean
    • buildディレクトリを削除。
  • jar
    • build/libsの下にgradle-sample-1.0.jarを作る。
  • war
    • build/libsの下にgradle-sample-1.0.warを作る(要 war プラグイン
  • buildDependencies
    • 指定したプロジェクトだけでなく、そのプロジェクトにtestRuntimeのプロジェクト依存関係を持っているすべてのプロジェクトをテスト。ガイドのマルチプロジェクトのビルドを参照(後でちゃんと読む)
Gradleビュー

開発中はGradleビューを常に表示させておくようにします。利用可能なタスクはダブルクリックで実行可。

右側に表示させておくのが個人的には好み。

バージョン管理

ビルドの成果物はbuildの下に生成されるので、buildディレクトリはバージョン管理の対象から除外し、逆に、それ以外のファイルはすべて管理させるのがよいのかなと思います。

とはいえ、.gradle〜みたいなファイルも生成されるけど、これも含めない方がいいのかも…。

依存関係の管理

ガイドの依存関係管理の基本はまさに基本。

外部依存関係定義は

    compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'

よりも、

    compile 'org.hibernate:hibernate-core:3.6.7.Final'

の方が好みなので、後者で定義を統一することにしました。mvnrepositoryで探すときも、Gradleタブで表示される記述は後者のものですし。

TODO

1. 初期プロジェクトのカスタマイズ

2. 下記プラグインでのタスクの意味。

apply plugin: "java"
apply plugin: "eclipse"
apply plugin: "war"

3. Jenkins側の設定

追記

タイムリーに公開されたNTTソフトウェア様のこの記事が詳しいです。