SEチャンネル

ITについてできる限り書くメモ

JavaビルドツールGradle入門(2/2)

f:id:tkmtys:20151012232244p:plain

次世代JavaビルドツールGradle入門2回目。前回作成したサンプルプロジェクトをWebアプリのビルド設定に変更する。プロジェクトのひな形作成については前回の記事「JavaビルドツールGradle入門(1/2) - SEチャンネル」を参照されたい。

依存ライブラリの追加

ビルドツールの最も根幹の機能は依存ライブラリの追加である。Gradleではbuild.gradleのdependenciesタグに追加する。デフォルトでは既に2つのライブラリが指定されているはずだ。

dependencies {
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

ここに以下のpom.xml形式で記述されたSpring Frameworkのライブラリを追加してみよう。

Maven (pom.xml)形式

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.0.0.RELEASE</version>
</dependency>

追加後のbuild.gradleは以下のようになる。指定方法もMavenと同じく、group、name(artifactId)、versionを指定する。

build.gradle

dependencies {
    compile group: 'org.springframework',name: 'spring-webmvc',version: '4.0.0.RELEASE'
    compile group: 'commons-collections',name: 'commons-collections',version: '3.2'
    testCompile group: 'junit',name: 'junit',version: '4.+'
}

eclipseのGradleプラグインは、Mavenのように自動でライブラリがダウンロードされない。eclipse上でプロジェクトを右クリック>「Gradle」から「Refresh Dependencies」をクリックする。

f:id:tkmtys:20151014220800p:plain

Gradle Dependenciesにspring-webmvc-4.0.0.RELEASE.jarと、さらにspring-webmvcが依存しているライブラリが追加されているはずだ。

f:id:tkmtys:20151014220753p:plain

ちなみにこのライブラリはどこからダウンロードしているかというと、なんとMavenのセントラルリポジトリからダウンロードされている。build.gradleにリポジトリ先が指定されているので、もし参照先リポジトリを変更する場合はここに記述すればよい。

repositories {
    mavenCentral()
}

Mavenセントラルの使用やMavenと同じGAV情報によるライブラリ指定と、GradleはMavenからの乗り換えをかなり意識した設計となっている

sponsor

warビルド

次にプロジェクトをWebアプリケーション化しよう。まずwarにビルドするため、warプラグインの記述を追加する。

build.gradle

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'war'

またWebアプリケーションのWebコンテンツ・ディレクトリも作成する。mavenと同じくsrc/main/webappが推奨だが、srcディレクトリとして追加する点がmavenと異なっている。追加した後のディレクトリツリーは以下のようになる。

f:id:tkmtys:20151017231527p:plain

動的Webモジュールfacetの追加と、gradleの参照ライブラリをWEB-INF/libに追加する設定も行っておく。

f:id:tkmtys:20151014222742p:plain f:id:tkmtys:20151014222747p:plain

ここまでの設定で、基本的なWebアプリのビルド設定は完了である。該当プロジェクトを右クリック>「Gradle Build ... 」を選択し、前回jarと入力したタスクをwarに変更してビルドを実行すればwarファイルが作成されるはずだ。

f:id:tkmtys:20151017232918p:plain

環境依存ファイルの差し替え

最後に環境依存ファイルの差し替え方法について解説する。単体試験や結合試験などの環境ごとに異なる設定ファイルをwarに含める場合、そのファイルを差し替えたwarを作成する必要がある。例えばDB接続先、AP内部で使用するURL(IP)、ログ出力レベルなどの設定ファイルが該当する。

まず環境ごとのリソース格納先を作成する。gradleではsrc/<プロファイル名>/resourcesが推奨である。src/main/resourcesに本番環境用の全設定ファイルを配置し、src/<プロファイル名>/resourcesには上書きするファイルのみ配置する。ディレクトリツリーは以下のようになる。

f:id:tkmtys:20151019061806p:plain

今回はenvというプロファイル名で作成した。src/main/resources配下にも上書き対象の同名のファイルを配置している。次にbuild.gradleに指定したプロファイルのリソースを読み込む設定を追加する。

sourceSets {
    main {
        resources {
            srcDirs "src/main/resources"
            srcDirs "src/$profile/resources"
        }
    }
}

実際にwarにビルドを行ってみよう。envプロファイルでwarを作成する場合は、build.gradleに指定した$profile変数にプロファイル名を渡す必要があるので、gradle実行時に-Pオプションを用いる

f:id:tkmtys:20151019062325p:plain

Runでビルドを実行すればsrc/env/resources配下の設定ファイルを含むwarが作成されるはずである。もしプロファイルを指定せずにsrc/main/resourcesのみでビルドする場合は-Pprofile=mainを指定すればよい。

build.gradle

最終的にbuild.gradleは以下の様になる。

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'war'

sourceCompatibility = 1.5
version = '1.0'
jar {
    manifest {
        attributes 'Implementation-Title': 'Gradle Quickstart',
                   'Implementation-Version': version
    }
}

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'org.springframework', name: 'spring-webmvc', version: '4.0.0.RELEASE'
    compile group: 'org.springframework.security', name: 'spring-security-core', version: '4.0.0.RELEASE'
    compile group: 'org.springframework.security', name: 'spring-security-web', version: '4.0.0.RELEASE'
    compile group: 'org.springframework.security', name: 'spring-security-config', version: '4.0.0.RELEASE'
    compile group: 'org.springframework.data', name: 'spring-data-mongodb', version: '1.2.0.RELEASE'
    compile group: 'cglib', name: 'cglib', version: '2.2.2'
    compile group: 'com.google.guava', name: 'guava', version: '19.0-rc2'
    providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
    providedCompile group: 'javax.servlet.jsp', name: 'javax.servlet.jsp-api', version: '2.3.1'
    providedCompile group: 'javax.servlet', name: 'jstl', version: '1.2'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

sourceSets {
    main {
        resources {
            srcDirs "src/main/resources"
            srcDirs "src/$profile/resources"
        }
    }
}

test {
    systemProperties 'property': 'value'
}

uploadArchives {
    repositories {
       flatDir {
           dirs 'repos'
       }
    }
}

読み込んでいるライブラリは、以前作成したWebアプリで使用したライブラリである。

tkmtys.hatenablog.com

まとめ

今回はJavaビルドツールGradleを使用してWebアプリのビルド設定を行った。GradleはMavenのセントラルを流用していたり、GAV情報でライブラリを指定したりと、Mavenから乗り換えのハードルはかなり低いため、今Mavenを使用しているなら乗り換えることをおすすめする。

sponsor