FrontPage

Javaでアプリケーションを作成する場合、ひとつのアプリケーションを 複数のプロジェクトから構成する場合もよくある。

Gradleでは、どのようにして複数プロジェクトのビルドを行うことが出来るのか、 以下に記述する。

マルチプロジェクトビルドの例

以下のようなプロジェクト構成で、ビルドを行えるようにする。

gradle-multi
│
├─app
└─common

gradle-multiが親プロジェクトで、その下位プロジェクトのappがcommonへ依存するとというよくある形である。

settings.gradleの定義

親プロジェクト直下にsettings.gradleを定義する。 以下のように記述する。

include 'common', 'app'

これでサブプロジェクトを認識するらしい。 以下でもOK。

include ':common', ':app'

build.gradleの定義

親プロジェクト直下にbuild.gradleを定義する。 以下のように記述する。

subprojects {
   apply plugin: 'java'
   apply plugin: 'eclipse'
   repositories {
       mavenCentral()
   }
}
project(':app') {
   dependencies {
       compile project(':common')
   }
}

subprojectsというのとても便利で、全てのサブプロジェクトに共通の定義を 記述することが出来る。

この場合には、javaプラグインとeclipseプラグインを各サブプロジェクトに適用する。

project(':app')以下に、app->commonの依存関係を定義する。

子プロジェクトにはビルドスクリプトを定義する必要はない。

親プロジェクトのみに定義が記述されていれば充分である。

ビルド

親ディレクトリ直下でgradle buildを実行すると以下のような結果が表示される。

:common :compileJava UP-TO-DATE
:common :processResources UP-TO-DATE
:common :classes UP-TO-DATE
:common :jar UP-TO-DATE
:app :compileJava UP-TO-DATE
:app :processResources UP-TO-DATE
:app :classes UP-TO-DATE
:app :jar UP-TO-DATE
:app :assemble UP-TO-DATE
:app :compileTestJava UP-TO-DATE
:app :processTestResources UP-TO-DATE
:app :testClasses UP-TO-DATE
:app :test UP-TO-DATE
:app :check UP-TO-DATE
:app :build UP-TO-DATE
:common :assemble UP-TO-DATE
:common :compileTestJava UP-TO-DATE
:common :processTestResources UP-TO-DATE
:common :testClasses UP-TO-DATE
:common :test UP-TO-DATE
:common :check UP-TO-DATE
:common :build UP-TO-DATE
BUILD SUCCESSFUL

また、試しにappディレクトリ直下でgradle buildを行うと以下のように結果が出力される。

:common :compileJava UP-TO-DATE
:common :processResources UP-TO-DATE
:common :classes UP-TO-DATE
:common :jar UP-TO-DATE
:app :compileJava UP-TO-DATE
:app :processResources UP-TO-DATE
:app :classes UP-TO-DATE
:app :jar UP-TO-DATE
:app :assemble UP-TO-DATE
:app :compileTestJava UP-TO-DATE
:app :processTestResources UP-TO-DATE
:app :testClasses UP-TO-DATE
:app :test UP-TO-DATE
:app :check UP-TO-DATE
:app :build UP-TO-DATE
BUILD SUCCESSFUL

どちらの場合でもcommonのコンパイル後にappのビルドが行われる。

つづけて、親プロジェクト直下でgradle eclipseを行うと、両方のプロジェクトがeclipseプロジェクトになり、かつビルドパスの設定も行われ、ecilpse上でもapp->commonの依存関係が出来る。

同一階層に親プロジェクトをおく場合

利便性の観点から、親プロジェクトを同一階層に置きたい場合もおおい。

もちろん、Gradleはそのような要求にも対応している。

以下のようなプロジェクト構成で試す。

├─app
├─common
└─parents
   └─build.gradle
       settings.gradle

同一階層のディレクトリを子プロジェクトとして認識させるためには、

includeFlatを使用する。

setting.gradleを以下のように記述し、parent直下に配置する。

includeFlat 'common', 'app'

階層構造の場合と違うのは以上のみ、build.gradleは同じものをそのまま使用できる。

プロジェクト構造の差分は、すべてsetting.gradleで吸収可能である。

孫ディレクトリのプロジェクトへ依存を張る場合

include hoge:fuga

のように依存を張ることができる。

ちなみに、java-multiprojectのサンプルでは以下のように設定している。

include "shared", "api", "services:webservice", "services:shared"

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-10-05 (日) 21:57:23 (1163d)