月曜日, 5月 30, 2016

Gradle - マルチプロジェクト

最近は専らmavenよりもgradleを使っている.近年はmake, ant,maven, sbtと比較的短期間で様々なビルドツールを使わざるを得なかったことに食傷気味ではあったが,gradleをいざ使ってみると,mavenやantの冗長なコンフィグからの脱却や拡張性の高さがすぐに気に入った.

以下はgradleでmavenのようなマルチモジュールのプロジェクトを定義した例.
以下の例では親プロジェクトが"tanu-im",子モジュールとして"desktop-ui"と"core"を想定している.

1. settings.gradleにはプロジェクトの定義を書く

rootProject.name = 'tanu-im'

include 'core'
include 'desktop-ui'

2. ルートプロジェクト直下のbuild.gradle. dependencyManagementを使いたいので,spring-gradleのdependency-managementプラグインを追加.
group 'org.tanuneko.im'
version '1.0-SNAPSHOT'

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'io.spring.gradle:dependency-management-plugin:0.5.6.RELEASE'
    }
}

3. common.gradleとdependencies.gradleの作成 共通の処理をcommon.gradle,プロジェクトの依存ライブラリをdependencies.gradleに定義.

common.gradle
// apply plugin here
apply plugin: 'java'
apply plugin: 'io.spring.dependency-management'
apply from: "${rootProject.projectDir}/gradle/dependencies.gradle"

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies.gradle

repositories {
    mavenCentral()
}

project.ext {
    // spring
    springVersion = '4.2.6.RELEASE'
    // JSON
    jacksonVersion = '2.7.1'
    // unit test
    junitVersion = '4.11'
    hamcrestVersion = '1.3'
    // util
    commonsLang3Version = '3.4'
    commonsIOVersion = '2.4'
    // logging
    slf4jVersion = '1.7.21'
    logbackVersion = '1.1.5'
}

dependencyManagement {

    dependencies {
        // spring
        dependency "org.springframework:spring-core:${springVersion}"
        dependency "org.springframework:spring-test:${springVersion}"

        // JSON
        dependency "com.fasterxml.jackson.core:jackson-databind:${jacksonVersion}"
        dependency "com.fasterxml.jackson.core:jackson-annotations:${jacksonVersion}"

        // unit test
        dependency "junit:junit:${junitVersion}"
        dependency "org.hamcrest:hamcrest-all:${hamcrestVersion}"

        // util
        dependency "org.apache.commons:commons-lang3:${commonsLang3Version}"
        dependency "commons-io:commons-io:${commonsIOVersion}"

        // logging
        dependency "ch.qos.logback:logback-classic:${logbackVersion}"
        dependency "org.slf4j:slf4j-api:${slf4jVersion}"
    }
}

dependencies {
    compile 'org.slf4j:slf4j-api'
    testCompile 'junit:junit'
    testCompile 'ch.qos.logback:logback-classic'
}

4. 子モジュールの作成.ルートプロジェクト直下に"core", "desktop-ui"のディレクトリを作ったのち,mavenスタンダードアーキタイプの構成を作る(e.g. src/[main|test]/[java|resources].
5. build.gradleを子モジュールのルートに作成.ここには子モジュール独自の依存関係や処理を定義.