マルチプロジェクトビルドのすゝめ その2

今回は Gradle のマルチプロジェクトビルドの機能を使って 実際に 簡単なシングルプロジェクトをマルチプロジェクトに移行してみることに...

もちろん 対象とするプロジェクトは Gradle でビルドできることが前提です。
ディレクトリ構成は 次のように ごく一般的なものです。


build.gradle はこんな感じ...
実際のプロジェクトは こんな簡単なスクリプトではないでしょうが とりあえず こんな感じで...

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

repositories {
    mavenCentral()
}

dependencies {
    providedCompile 'javax.servlet:servlet-api:2.5'
    providedCompile 'javax.servlet.jsp:jsp-api:2.1'
    runtime 'javax.servlet:jstl:1.1.2'
    runtime 'taglibs:standard:1.1.2'
}

group            = 'com.bluepapa32.bookstore'
version          = '1.0.0-SNAPSHOT'
archivesBaseName = 'bookstore'

// 何らかのタスク
task something << {
    println project.name
}

いきなり プロジェクトを分割して ビルドできなくなるとまずいので まずは 既存のプロジェクトをそのままサブプロジェクトに移行します。
サブプロジェクトが一つしかなくたって マルチプロジェクトなのです。

手順はとっても簡単です。
まずは bookstore の下に ディレクトリ (ここでは webapp) を作成して その配下に src を移動します。
こんな感じになるはず...


次に build.gradle を

subprojects {

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

    repositories {
        mavenCentral()
    }

    dependencies {
        providedCompile 'javax.servlet:servlet-api:2.5'
        providedCompile 'javax.servlet.jsp:jsp-api:2.1'
        runtime 'javax.servlet:jstl:1.1.2'
        runtime 'taglibs:standard:1.1.2'
    }

    group            = 'com.bluepapa32.bookstore'
    version          = '1.0.0-SNAPSHOT'
    archivesBaseName = 'bookstore'

    // 何らかのタスク
    task something << {
        println project.name
    }
}
のように修正します。
全てのスクリプトを subprojects のクロージャの中に入れるだけなのでとっても簡単です。

最後に bookstore の下に settings.gradle を作成して

include 'webapp'
のようにサブプロジェクトの名前を記述します。
これで とりあえず マルチプロジェクトへの移行は終了です。
最終的にはこんな感じに...


後はいつものように bookstore の下で

$ gradle build
を実行すれば
:webapp:compileJava
:webapp:processResources
:webapp:classes
:webapp:jar
:webapp:war
:webapp:assemble
:webapp:compileTestJava
:webapp:processTestResources
:webapp:testClasses
:webapp:test
:webapp:check
:webapp:build

BUILD SUCCESSFUL
のようにビルドされます。
タスク名の前にサブプロジェクト名 :webapp がつくのが マルチプロジェクトビルドの証です。ちゃんと
webapp/build/libs/bookstore-1.0.0-SNAPSHOT.war
のように成果物も作成されます。
もちろん、サブプロジェクトの webapp の下で
$ gradle build
としてもビルドできます。
今はサブプロジェクトが一つしかないので この違いはわかりませんが、 実際は メインプロジェクトの配下でビルドすると 全てのサブプロジェクトがビルドされ、 サブプロジェクトの配下でビルドすると そのサブプロジェクトとサブプロジェクトに依存するプロジェクトだけがビルドされるのです。

この辺りの話はまた次回と言うことで今回はここまで...