usotech

erratic magical world

Eclipse で Gradle を使う (2) マルチプロジェクト構成

前回 に続き、今度はマルチプロジェクト構成を試してみた。Eclipse で管理する場合はフラットレイアウトでないと扱いづらいため、フラットレイアウトで作成する。結果は Gist に纏めてみたけどココにも全部書いてる。

プロジェクト構成

以下のようなプロジェクト構成を想定。

  • workspace
    • util
    • model
    • persistence
    • service
    • api
    • web
    • master-build
    • .git

依存関係としては

  • model -> util
  • persistence -> model
  • service -> model + persistence
  • web -> service

といった感じ。master-build がフラットレイアウトの親プロジェクト。

親プロジェクトの設定

STS の Gradle プラグインでもマルチプロジェクト構成を作ることは出来るのだが、どうもこの機能を使って作るとプロジェクトのリネームをしてもリソースのフォルダ名が変わらなかったりして使いづらいので、普通に手で build.gradle などを配置した方が良さそう。

まず適当なフォルダに想定しているプロジェクトのフォルダを作る。次に、親プロジェクトは master-build という前提なので、ここに build.gradle を記述する。

apply plugin: 'eclipse'
 
subprojects {
    
    apply plugin: 'java'
    apply plugin: 'eclipse-wtp'
 
    jdkVersion = 1.7
    sourceCompatibility = jdkVersion
    targetCompatibility = jdkVersion
    version = '0.1'
    vendor = 'vendor.com'
 
    repositories {
       mavenCentral()
    }
 
    dependencies {
        compile group: 'com.google.guava', name: 'guava', version: '13.0.1'
        testCompile 'junit:junit:4.8.2'
    }
 
    jar {
        manifest.attributes provider: 'gradle'
        manifest.attributes 'Implementation-Vendor-Id': vendor
        manifest.attributes 'Implementation-Vendor': vendor
        manifest.attributes 'Implementation-Version': version
    }
 
    eclipse {
 
      classpath {
        file {
          whenMerged { classpath ->
            classpath.configure classpath.entries.grep { entry ->
              !(entry instanceof org.gradle.plugins.ide.eclipse.model.Library)
            }
          }
        }
      }
 
    }
 
    task mkdirs << {
      ["src/main/java", "src/main/resources", "src/test/java", "src/test/resources"].each {
        def path = "${projectDir}/${it}"
        ant.mkdir(dir: path)
        ant.touch(file: "${path}/.gitkeep")
      }
    }
 
 
}
 
task wrapper(type: Wrapper) {
    gradleVeresion = '1.4'
}

mkdirs というタスクは下位プロジェクトのソースフォルダを作るのが面倒くさかったのでユーティリティとして作ったもの。eclipse の設定を書き換えているのは、普通に gradle eclipse すると jar のパスが直接書き込まれてしまうので、これを削除するもの。こちら から拝借しました。

settings.gradle は普通に子プロジェクトを定義するだけ。

includeFlat "util", "model", "persistence", "service", "api", "web"

但し include ではなく includeFlat を使うのがポイント。こうするとフラットなプロジェクト構成を認識してくれる。

子プロジェクトの設定

基本的に build.gradle を書くだけなのだけど、web を例にとるとこんな感じ。dependencies - compile project で依存プロジェクトを設定する。

apply plugin: 'war'
 
dependencies {
  providedCompile 'javax.servlet:servlet-api:2.5'
  compile project(':api')
  compile project(':service')
}
 
war {
    manifest.attributes = jar.manifest.attributes
    manifest.attributes 'Implementation-Title': 'web'
}

war を作成するのでこのプロジェクトだけ war プラグインを入れてる。マニフェストの設定も jar から拝借するようにした。

ビルドしてみる

早速ビルドしてみる。

$ ./gradlew build

して問題なくビルド出来れば OK。ちなみに web のみ war プラグインを入れているのだけど、そうすると賢く war もビルドしてくれて至れり尽くせり。

Eclipse プロジェクト化

プロジェクト構成は出来上がったので master-build プロジェクトから以下のコマンドを実行すると Eclipse プロジェクト化してくれる。

$ ./gradlew eclipse

Eclipse を起動し、Import - Gradle Project からインポートするのだけど、注意点としてはここでインポートする際には Gradle の親プロジェクトを選ぶところ。今回だと master-build を選択し、Build Model してからインポートする。

あとは Team - Share から Git を選び、親プロジェクト直下に .git を作って管理すれば良いと思う。