概要
プロジェクトに複数のバッチ処理がある場合、1つのプロジェクトに複数のバッチを入れる、複数のプロジェクトに分けるなどの選択肢があります。
この記事では、前者の1つのプロジェクトに複数のバッチを入れるのアプローチで、Mainクラスを分ける方法を試しました。
前提
>gradle -v
------------------------------------------------------------
Gradle 6.5
------------------------------------------------------------
Build time: 2020-06-02 20:46:21 UTC
Revision: a27f41e4ae5e8a41ab9b19f8dd6d86d7b384dad4
Kotlin: 1.3.72
Groovy: 2.5.11
Ant: Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM: 11.0.2 (Oracle Corporation 11.0.2+9)
OS: Windows 10 10.0 amd64
STS 3.9.9.RELEASE(いい加減4系にしないと・・・)
プロジェクト構成
multiple-main
└src/main/java
└com/example/dem
├MultipleApplication.java
└MultipleApplication2.java
Mainクラスの呼び分け方法
STSの場合
Spring Applicationを実行しようとすると、下図のようにMainクラスを選ぶ画面が出てくるので、実行したい方を選ぶ。
Gradleの場合
applicationプラグインを読み込ませたうえで、mainClassを指定する。
いちいちbuild.gradleを書き換えないといけないので不便ですね。
(参考リンク1)
plugins {
id 'org.springframework.boot' version '2.3.5.RELEASE'
id 'io.spring.dependency-management' version '1.0.10.RELEASE'
id 'java'
id 'application'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
mainClassName = "com.example.demo.MultipleMainApplication2"
repositories {
mavenCentral()
}
jar実行の場合
java -cp multiple-main-0.0.1-SNAPSHOT.jar -Dloader.main=com.example.demo.MultipleMainApplication org.springframework.boot.loader.PropertiesLauncher
(参考リンク2)
PropertiesLauncher is 何者?という感じですが、build.gradleのmainClassがMultipleMainApplication2の状態でも、MultipleMainApplication(無印)の方を起動することが出来ました。
まとめ
一応出来なくもないけど、筋悪な気がしました。
Mainクラスだと、Spring管理下のBeanを扱いづらい(扱えないわけではない)ので、1つのプロジェクトに複数の処理を入れるのであれば、下記の記事を参考にRunnerを切り替える方法が良いと思います(現場でもこの方法を採用した)。
Spring Bootの実行可能jarに複数のCommandLineRunner/ApplicationRunner実装クラスを入れて、起動時のプロパティで実行するクラスを切り替える - Qiita