SpringBoot+Gradleで別rootのプロジェクトへ依存関係をつけたビルド構成にする
やること
開発中のプロダクトで以下のようなgit repository上の構成にしたかったのですが、gradleがサポートしているmulti projectの構成だとうまいやり方がみつからなかったので以下のような方法で対応してみました。
- A: サーバー共通処理やドメインモデルをまとめたレポジトリ
- B: 個別の業務処理を行うサーバーのソースを格納したレポジトリでAに依存
- C: 個別の業務処理を行うサーバーのソースを格納したレポジトリでAに依存
Gradle multi project についてはこちら
以下リンクに公式の説明があります
第57章 マルチプロジェクトのビルド
フラット階層だと以下のような構成になるイメージです。
GitRoot | |-root | |--build.gradle | |--settings.gradle |-appA |-appB
やり方
Gradle設定ファイルの編集
以下の構成の前提です。 各プロジェクトのひな形はSPRING INITIALIZRで作っておきます。(ParentProjectは単独で起動させないのでのBoot用Javaソースは削除)
ChildProject |--build.gradle |--settings.gradle ParentProject |--build.gradle
子プロジェクト側の設定に以下を追加します。
- settings.gradleに以下記載(なければ新規作成してください)
include ':ParentProject' project(':ParentProject').projectDir = new File('../ParentProject')
- build.gradleに以下記載
dependencies { compile project(':ParentProject') }
親プロジェクト側の設定に以下を追加します。
- build.gradleに以下記載
springBoot { mainClass = "org.gradle.sample.Scan" }
Javaクラスの作成
親プロジェクト側にComponentScanのエントリーポイントになるクラスを用意します。 DI対象のクラスはこの下に配置します。
ParentProject |--src.xx |--Application.java |--service |--SampleService.java
Application.java
@ComponentScan public class Application { }
SampleService.java
@Component public class SampleService { @PostConstruct public void test() { System.out.print("DI success!"); } }
動作確認
ChildProjectを起動します。
cd ${ChildProjectのルートディレクトリ} ./gradlew bootRun
"DI success!"が表示されれば成功です。