Spring Bootをjavaコマンドで起動する

Spring Bootウェブアプリをjarファイルにパッケージ化して、コマンド上からjavaコマンドでSpring Bootウェブアプリを起動する方法について説明しています。

※ 本ページはプロモーションが含まれています。

目的と動作環境

最終更新日:2023/5/28

EclipseでSpring Bootのウェブアプリ(WebサイトやWeb APIなど)をプログラミング開発する場合、Eclipse上でアプリを起動して動作確認をすると思います。

ただSpring Bootアプリの開発がある程度完成して普段からアプリを使いたい段階になったら、毎回Eclipseを起動してEclipse上でアプリを起動するのはちょっと面倒です。(Eclipseを起動すればメモリを消費して動作も重くなりますし)。できればもうEclipseは起動せずにSpring Bootアプリを起動して使いたいです。

という事で本記事では、Eclipseで開発しているSpring Bootアプリをjarファイルにパッケージ化して、コマンドライン上からjavaコマンドでSpring Bootアプリを起動する方法について説明します。

◾️動作環境とバージョン情報です
Spring Bootバージョン:2.7.8
Java:11
開発環境:Eclipse(Pleiades All in One、4.16(2020-06)、Java Full Edition版)
ビルドツール:Maven
OS:macOS Big Sur(バージョン11.7.3)

コマンドライン上でjavaコマンドを実行できる事が前提です。JDKかJava実行環境のJREをインストールすればjavaコマンドを使えるようになります。

Spring Bootアプリをjarファイルにパッケージ化するにはビルドツールが必要ですが、ここではビルトツールはMavenを使っています(pom.xmlファイル)。他のメジャーなビルドツールにはGradleがあります。

EclipseでSpring BootプロジェクトをMavenビルドしてjarファイルにパッケージ化する。そしてjavaコマンドでjarファイル化したSpring Bootアプリを実行する。

まず、Eclipse上で対象のSpring Bootのプロジェクトを右クリックして、「実行」->「8 Maven ビルド…」を選択して「構成の編集」ウインドウを開きます。

そして、構成の編集ウインドウのゴール欄に「package」と入力して実行ボタンを押すとビルド作業が開始します。
EclipseでSpring BootをMavenビルドしてjarファイルを作成

ちなみにMavenのゴールの種類はpackageの他にはcompile,test,clean…などがあります。ゴールをcleanで実行するとpackageやcompileビルドで作成したファイルを綺麗に削除してくれます。

ビルド作業のログはEclipseのコンソールタブ上に出力されます。パッケージビルドが問題なく成功すれば最後の方で「BUILD SUCCESS」と出るはずです。あと、ゴールがpackageだとビルドしてjarファイルの作成だけじゃなくて、テストをしているのもメッセージで確認できます。

〜
[INFO] Results:
[INFO] 
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] 
[INFO] --- maven-jar-plugin:3.2.2:jar (default-jar) @ myhogeapp ---
[INFO] Building jar: /Users/hogeuser/testeclipse/workspace/myhogeapp/target/myhogeapp-0.0.1-SNAPSHOT.jar
[INFO] 
[INFO] --- spring-boot-maven-plugin:2.7.8:repackage (repackage) @ myhogeapp ---
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

パッケージビルドが成功すれば、Spring Bootプロジェクトのtargetディレクトリにjarファイルが出力されるはずです。(Eclipse上ならプロジェクトを右クリックしてリフレッシュを選択すれば、targetディレクトリ内のファイルが見れます。)
あとビルド時のコンソールログにjarファイルのフルパスも出力してくれます(「[INFO] Building jar: 〜 」の行)。

$ ls -lht workspace/myhogeapp/target/
total 86744
-rw-r--r--  1 hogeuser  staff    42M  2 26 04:12 myhogeapp-0.0.1-SNAPSHOT.jar
-rw-r--r--  1 hogeuser  staff    61K  2 26 04:12 myhogeapp-0.0.1-SNAPSHOT.jar.original
drwxr-xr-x  3 hogeuser  staff    96B  2 26 04:11 maven-archiver
drwxr-xr-x  4 hogeuser  staff   128B  2 26 04:09 surefire-reports
drwxr-xr-x  3 hogeuser  staff    96B  2 26 04:09 generated-test-sources
drwxr-xr-x  3 hogeuser  staff    96B  2 26 04:09 maven-status
drwxr-xr-x  3 hogeuser  staff    96B  2 26 04:09 generated-sources
drwxr-xr-x  6 hogeuser  staff   192B  2 17 23:38 classes
drwxr-xr-x  3 hogeuser  staff    96B  2 17 23:38 test-classes

私の環境(プロジェクト)では、myhogeapp-0.0.1-SNAPSHOT.jarというファイルが作成されました。
(「プロジェクト名-バージョン情報.jar」というファイル名のjarファイルが出力される。)

jarファイルを作成できたので、コマンドライン上からjavaコマンドでSpring Bootアプリを実行してみます。
targetディレクトリに移動して(別に移動しなくてもいいが…)javaコマンドを実行します。(jarファイルを実行する時は-jarオプションを付ける)

$ java -jar myhogeapp-0.0.1-SNAPSHOT.jar

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

2023-02-26 06:01:19.146  INFO 10740 ---
〜
Started MyhogeappApplication in 6.924 seconds (JVM running for 7.741)
コマンドターミナル上に起動ログが出力されました。そして、ブラウザ上でSpring Bootウェブアプリが問題なく動作する事も確認できました!

パッケージ化して出力したjarファイルは持ち運べるので、もちろん他のディレクトリに移動・コピーしても実行できます。

MySQLなどのDBと連携したSpring Bootアプリの場合、packageビルド実行時にMySQLを起動していないとビルドエラーが出るので、ちゃんとMySQLを起動した状態でビルドする必要がありそうです。
〜
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure
〜
Caused by: java.net.ConnectException: Connection refused (Connection refused)
〜
[INFO] Results:
[INFO] 
[ERROR] Errors: 
[ERROR]   MyhogeappApplicationTests.contextLoads » IllegalState Failed to load Appli...
[INFO] 
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------

packageビルドで作成されるjarファイルのバージョン情報を更新する方法

packageビルドで出力されるjarファイルのファイル名にはバージョン情報が付きますが(「-0.0.1-SNAPSHOT.jar」みたいなの)、これはpom.xmlのversionタグの情報です。

ですので、versionタグのバージョン情報を変更すれば、パッケージビルドで出力されるファイル名も変更されます。開発しているSpring Bootアプリを変更した時には、このバージョン情報を変更してjarファイルを解りやすく更新するのが良いと思います。

DBがH2の場合にビルド実行時に出るエラー

Spring BootのDBにH2を使用している場合にパッケージビルドを実行したら、JdbcSQLNonTransientConnectionExceptionという例外が発生しました。

〜
org.h2.jdbc.JdbcSQLNonTransientConnectionException: データベースはすでに閉じられています (VM終了時の自動データベースクローズを無効にするためには、db URLに ";DB_CLOSE_ON_EXIT=FALSE" を追加してください)
Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-214]
〜

例外は発生するけどビルド自体は成功してjarファイルは問題なく作成されたので気にする必要は無いかもしれませんが、メッセージ通りにapplication.properties ファイルのDBの接続設定箇所に「;DB_CLOSE_ON_EXIT=FALSE」を追加したら、この例外は発生しなくなりました。(hogedbは適当なDB名)
■編集前

spring.datasource.url=jdbc:log4jdbc:h2:mem:hogedb
■編集後
spring.datasource.url=jdbc:log4jdbc:h2:mem:hogedb;DB_CLOSE_ON_EXIT=FALSE

(広告)AmazonでSpring Boot3(バージョン3系)の初心者向け入門書を探す!本でSpring Bootプログラミング開発を体系的に勉強する!

Spring Bootの画面側(HTML)で使われるJavaテンプレートエンジンのThymeleafで共通部分のHTMLを別ファイル化して共有する方法について説明しています。例えば、ヘッダー、フッター、サイドバーやmetaタグ、linkタグなどのHTMLはどのページでも共通しているのでそれを別ファイルにして、各ページから別ファイル化して共通部分のHTMLを共有するという感じです。
Thymeleafで共通部分のHTMLを別ファイルにする

macやLinuxサーバ上にMySQL(MariaDB)と連携したSpring Bootアプリの実行環境を構築する

macOSやLinux環境上でDB(MySQLとか)を使うSpring Bootアプリを動かしたい場合、JDK(JRE)をインストールしてJava実行環境を作れば、上で説明したようにjavaコマンドでSpring Bootアプリを動作させる事ができます。

別ページで、オープンソースのJava実行環境のOpenJDK(OpenJRE)とMySQL(MariaDB)をインストールして、DBと連携したSpring Bootアプリの実行環境の構築手順を説明しているので参考にしてください。
Spring Boot + MySQL(MariaDB)の実行環境を作る