Things of interesting

プログラミングに関する技術ネタの備忘録

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!"が表示されれば成功です。