Spring Bootアプリケーションで、複数アプリケーション間で共通に使われるコンポーネントを別のプロジェクトに切り出し、 当該プロジェクトをJARとしてMavenリポジトリー経由で配布可能とする。
- ビルドはGradle、開発言語はKotlin。プロジェクトはSpring Initializrで作るが、build.gradleはGroovy DSLに差し替え済。
- ライブラリー用プロジェクト、アプリケーションプロジェクトの2つを作る。
- 両者ともに、build.gradleにはプライベートMavenリポジトリー(自分でライブラリーを配置・参照できるもの)が登録済である。
基本的に通常のSpring BootアプリケーションとしてSpring Initializrなどでプロジェクトを作ればよい。 ライブラリー用プロジェクトでは、以下の通りbootJarを無効化し、通常Spring Bootでは無効化されているjarを有効化する。
そもそもライブラリー用プロジェクトをSpring Bootアプリケーションとして起動することはないし、 後述の通りライブラリープロジェクトではApplicationクラスを作成する必要がないが、bootJarではApplicationクラスがないと エラーとなるため、この対応が必要。
bootJar {
enabled = false
}
jar {
enabled = true
}
Spring Initializrでプロジェクトを作成すると、Applicationクラス(@SpringBootApplicationが付与されたクラス) が作成されているが、これを削除する。
ライブラリー用プロジェクトをdependenciesに指定する。 なお、ライブラリー用プロジェクトで行ったbootJar無効化、jar有効化は、アプリケーションプロジェクトでは不要。 (むしろ、これを設定したら起動できなくなるので、やってはいけない)
dependencies {
implementation("dev.kazusato:simple-lib-spring:0.1.0")
(中略)
}
デフォルトのSpring BootではApplicationクラスの所属するパッケージ配下しかスキャン対象とならない。 @ComponentScanを付与することで、スキャン対象を変更することができる。 この際、自プロジェクト分(@ComponentScanを付与しない場合のスキャン対象)についても明示的に指定が必要となる。
@ComponentScan("dev.kazusato.simplelibspring", "dev.kazusato.springlibuser")
@SpringBootApplication
class SpringLibUserApplication
通常通り、アプリケーションプロジェクトに対して、
$ ./gradlew bootRun
などとすればよい。