Featured image of post Gradleでマルチプロジェクトを作る

Gradleでマルチプロジェクトを作る

もともと自分が学んでいたのはMavenを利用したSpring MVCのプロジェクトを作る方法でしたが、最近はGradleで管理されるSpring Bootプロジェクトを触っています。最初はGradleを単純にMavenと似たような依存関係用のツールだとしか思ってなかったですが、直接タスクを作ったりJarをビルドしたり色々挑戦してみてからそう単純なものではないということに気付きました。

その中でも最も良いと思ったのは、それぞれ違う機能を持つ個別のプロジェクトをマルチプロジェクトという概念で管理できることでした。OOPの観点からしてクラスやパッケージだけを分けるのではなく、プロジェクト単位の分け方によってより維持保守に長けているアプリケーションを作られるのではないか、と思います。

なのでここではまず簡単にGradleのマルチプロジェクトが何であり、その作り方について簡単に説明したいと思います。

Gradle Multi Project

Graldeのマルチプロジェクトは、その名の通り複数のプロジェクトで構成されているプロジェクトのことを意味します。具体的には全ての起点となるルートプロジェクトがあり、その配下に複数のGradleプロジェクトが入っている形になります。ルートプロジェクトの配下で管理されるプロジェクトたちはサブプロジェクトといいます。

こういうマルチプロジェクトの作り方は今回紹介する方法とはまた違うものもあるらしく、プロジェクトのフォルダ構成にも違いがあるようです。

ただ、マルチプロジェクトは複数プロジェクトの管理を簡単にさせるということにその目的があると思いますので、一つのリポジトリ単位で管理できるようにルートプロジェクトの中にサブプロジェクトが入っている形を採用します。これは実際自分が仕事で書いているSpring Bootプロジェクトの構成でもあります。

また、ここで紹介しているのはEclipseを基準にした説明となります。(他のIDEはまだ詳しくないので…)

Root Project

全てのサブプロジェクトを含む大元となるルートプロジェクトを作ります。一般的なGradleプロジェクトをまず作成します。ただbuild.gradleはこれからサブプロジェクトに使う予定なので、コピーしておきましょう。あとはいらなくなったファイルとフォルダを削除します。ここで残すファイルとフォルダは以下だけです。

  • gradle(フォルダ)
  • build.gradle
  • gradlew
  • gradlew.bat

以上のファイルとフォルダを残したら、次はbuild.gradleファイルを修正します。ルートプロジェクトはサブプロジェクトの管理だけをしていて、必要なタスクやプラグイン、依存関係の設定はサブプロジェクトで記述します。なのでなるべくシンプルにしましょう。

subprojects {
    repositories {
        mavenCentral()
    }
}

ここでやっていることは、サブプロジェクトのリポジトリ指定だけですが、同じやり方でサブプロジェクトのbuild.gradleに共通記述しなければならないことはなんでも入れていいです。例えばプラグインとかがあるでしょう。

次に、settings.gradleファイルを作成します。このファイルはルートプロジェクトとサブプロジェクトを紐付け、プロジェクト名を決める役割をします。

include 'core'
include 'web'

rootProject.name = 'TestProject'
rootProject.children.each { it.name = rootProject.name + '-' + it.name }

includeと書いたものはサブプロジェクトで、rootProject.nameはその名の通りルートプロジェクト名を意味します。他にも命名できる方法はありますが、あくまでルートプロジェクト名がこのプロジェクト全体を意味するもので、サブプロジェクトはそのうちの一つの機能単位という感覚て命名しています。

rootProject.children.each { it.name = rootProject.name + '-' + it.name }では、ルートプロジェクト名にダッシュをつけ、その下にサブプロジェクト名を付けています。これは以下の方法でも表現できます。

rootProject.children.each { p -> p.name = "${rootProject.name}-${p.name}"}

この命名法によりそれぞれのサブプロジェクトはTestProject-coreTestProject-webのように命名されます。

こう構成したプロジェクトをEclipseのパッケージエクスプローラからみると、以下のように見えるようになります。

  • TestProject
  • TestProject-core
  • TestProject-web

あとでもしサブプロジェクトを追加する必要があるとしたら、ルートプロジェクトのincludeを記述することで自動的にTestProject-...という風にサブプロジェクト名が付けられることとなります。

Sub Project

ルートプロジェクトの準備が終わったら次は、子要素のサブプロジェクトを作ります。サブプロジェクトは普通のGradleプロジェクトでも良く、ルートプロジェクトの配下に置くだけで使えるようになりますが、ここでは空のフォルダを作成して作る方法を紹介します。

まずルートプロジェクトの配下にサブプロジェクトとして使うフォルダを作ります。フォルダ名をサブプロジェクト名として使う予定なので、適したフォルダ名を選びます。ここでフォルダ名はルートプロジェクトのsettings.gradleで記述したincludeと一致しなければならないです。例えば上のルートプロジェクトではcorewebをすでに書いているので、それに合わせてcorewebのフォルダを作成します。

フォルダを作成したら、その中にルートプロジェクトを作成した時コピーしておいたbuild.gradleを置いて編集します。今回はEclipseを基準にJavaプロジェクトを生成するので以下のようなプラグインが必要です。

plugins {
    id 'eclipse'
}

ファイルを保存してルートプロジェクトからgradlew tasksを実行すると、ide節にeclipseがあります。こちらのタスクを実行します。コマンドラインだとgradlew eclipseを入力することで実行できます。もちろんEclipse上でも実行できますが、更新に時間がかかる場合があるのでコマンドラインの方をお勧めします。

このタスクを実行することで、作成したフォルダの中にEclipseプロジェクトとして機能するための準備ができます。あとは普通のJavaプロジェクトのようにソースフォルダ(src/main/java)を生成し、パッケージを作成してサブプロジェクトの中を埋めていきます。

もしマルチプロジェクトがEclipse上で正しく認識されない場合は、プロジェクトを右クリックしてリフレッシュしたり、GradleメニューからGradleプロジェクトのリフレッシュを実行してください。

Sub Project Dependency

この方法で作成したマルチプロジェクトでは、サブプロジェクト同士で依存することもできます。例えばwebプロジェクトの起動にcoreプロジェクトで作成したクラスを読み込む必要があるときは、webbuild.graldeで以下のように記述するとcoreのクラスをインポートできるようになります。

dependencies {
    implementation project(':TestProject-core')
}

ただこの場合、webの起動時に一度coreプロジェクトをコンパイルすることになるのでテスト時にcore側の修正事項は即反映されないので注意しましょう。

最後に

まだEclipse上でGradleのマルチプロジェクトの生成を簡単にできる方法がなく、このような多少不便な方法でしかプロジェクトの作成ができないというところが不便ですね。のちに追加されるかもしれませんが…

でもまずはマルチプロジェクトを構成する方法とその構造がどんなものかが理解できれば、これから活用できる道が増えていくのはでないかと思います。特にプロジェクトの規模が大きくなればなるほど、こういう管理の仕方だ必要になるのではないでしょうか。

それでは皆さんもぜひ、Gradleのマルチプロジェクトを試してみてください!

Built with Hugo
Theme Stack designed by Jimmy