[SpringBoot] bootJarで作成したFat jarにて複数起動クラスを扱う方法

スポンサーリンク

SpringBootではbootJarタスクを実行することで実行可能jar(Executable Jar)を作成することができます。

しかしながらこのjar、ひとつのメインクラスしか指定できません・・・

今回は複数mainクラスを作成し、起動できる方法を紹介します!!

準備

とりあえず実験のため、Spring Initializrに行って適当なgradleプロジェクトを作成します。

作成したプロジェクトを解凍後、プロジェクト直下で以下コマンドを実行し、jarを作成しましょう!
※gradleは別途準備が必要です。

gradle bootJar

javaコマンドのjarオプションで作成したjarを指定して実行すると・・・

java -jar demo-0.0.1-SNAPSHOT.jar

こんな感じで既定のmainクラス(DemoApplication)が起動します。

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.6.3)

2022-02-13 14:29:53.657  INFO 25784 --- [           main] com.example.demo.DemoApplication         : Starting DemoApplication using ...
2022-02-13 14:29:53.659  INFO 25784 --- [           main] com.example.demo.DemoApplication         : No active profile set, falling back to default profiles: default
2022-02-13 14:29:54.026  INFO 25784 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 0.629 seconds (JVM running for 0.869)
スポンサーリンク

mainクラス追加&ビルド

追加してビルドしてみると・・・

demoApplicationと同じ階層に以下のクラスを追加してみます。

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MainApplication  {

	public static void main(String[] args) {
		SpringApplication.run(MainApplication.class, args);
	}
}

先ほどと同じく、gradleのbootJarタスクを実行してみると・・・

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':bootJarMainClassName'.
> Unable to find a single main class from the following candidates [com.example.demo.MainApplication, com.example.demo.DemoApplication]

エラーが発生!/(^o^)\ナンテコッタイ

エラー解消

エラーメッセージを見る感じだと、メインクラスがひとつじゃないのでエラーが出ている模様。

とはいえ、今回は複数メインクラスを扱いたいので、ひとつにするわけにはいきません。

ということで、build.gradleのbootJarタスクでメインクラスを指定することで回避します。

/* build.gradle */
...
// 以下を追記
bootJar {
	mainClass = 'com.example.demo.DemoApplication'
}
...

上記を追記することで問題なくビルドできました^ ^

スポンサーリンク

起動方法

いよいよ、今回のメインとなる起動方法です!

先ほどbuild.gradleで指定したクラスか否かで起動方法が変わってきます。

mainClassで指定したクラスの場合

この場合は今まで通り、-jarオプションをつけて起動すればOKです。

java -jar <jar_filename>

任意のmainクラスの場合

こちらは今までとちょっと勝手が違っており、以下のようなコマンドを打つことで任意のmainクラスを起動クラスとして実行することが可能となります。

java -cp <jar_filename>; -Dloader.main=<mainClass>  org.springframework.boot.loader.PropertiesLauncher

例えば今回作った「com.example.demo.MainApplication」の場合だと・・・

java -cp demo-0.0.1-SNAPSHOT.jar -Dloader.main=com.example.demo.MainApplication org.springframework.boot.loader.PropertiesLauncher

とすることで・・・

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.6.3)

2022-02-13 14:52:51.817  INFO 20676 --- [           main] com.example.demo.MainApplication         : Starting MainApplication using ...
2022-02-13 14:52:51.820  INFO 20676 --- [           main] com.example.demo.MainApplication         : No active profile set, falling back to default profiles: default
2022-02-13 14:52:52.197  INFO 20676 --- [           main] com.example.demo.MainApplication         : Started MainApplication in 0.649 seconds (JVM running for 0.899)

MainApplicationが起動できました!!

ちなみにクラスパスは複数追加可能です。
以下はカレントディレクトリをクラスパスに追加した例です。

java -cp ./;demo-0.0.1-SNAPSHOT.jar -Dloader.main=com.example.demo.MainApplication org.springframework.boot.loader.PropertiesLauncher

今回は以上です^ ^

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です