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
今回は以上です^ ^
コメントを残す