もともと自分が学んでいたのは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-core
やTestProject-web
のように命名されます。
こう構成したプロジェクトをEclipseのパッケージエクスプローラからみると、以下のように見えるようになります。
- TestProject
- TestProject-core
- TestProject-web
あとでもしサブプロジェクトを追加する必要があるとしたら、ルートプロジェクトのinclude
を記述することで自動的にTestProject-...
という風にサブプロジェクト名が付けられることとなります。
Sub Project
ルートプロジェクトの準備が終わったら次は、子要素のサブプロジェクトを作ります。サブプロジェクトは普通のGradleプロジェクトでも良く、ルートプロジェクトの配下に置くだけで使えるようになりますが、ここでは空のフォルダを作成して作る方法を紹介します。
まずルートプロジェクトの配下にサブプロジェクトとして使うフォルダを作ります。フォルダ名をサブプロジェクト名として使う予定なので、適したフォルダ名を選びます。ここでフォルダ名はルートプロジェクトのsettings.gradle
で記述したinclude
と一致しなければならないです。例えば上のルートプロジェクトではcore
とweb
をすでに書いているので、それに合わせてcore
とweb
のフォルダを作成します。
フォルダを作成したら、その中にルートプロジェクトを作成した時コピーしておいた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
プロジェクトで作成したクラスを読み込む必要があるときは、web
のbuild.gralde
で以下のように記述するとcore
のクラスをインポートできるようになります。
dependencies {
implementation project(':TestProject-core')
}
ただこの場合、web
の起動時に一度core
プロジェクトをコンパイルすることになるのでテスト時にcore
側の修正事項は即反映されないので注意しましょう。
最後に
まだEclipse上でGradleのマルチプロジェクトの生成を簡単にできる方法がなく、このような多少不便な方法でしかプロジェクトの作成ができないというところが不便ですね。のちに追加されるかもしれませんが…
でもまずはマルチプロジェクトを構成する方法とその構造がどんなものかが理解できれば、これから活用できる道が増えていくのはでないかと思います。特にプロジェクトの規模が大きくなればなるほど、こういう管理の仕方だ必要になるのではないでしょうか。
それでは皆さんもぜひ、Gradleのマルチプロジェクトを試してみてください!