Spring Bootウェブアプリをjarファイルにパッケージ化して、コマンド上からjavaコマンドでSpring Bootウェブアプリを起動する方法について説明しています。
※ 本ページはプロモーションが含まれています。
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のプロジェクトを右クリックして、「実行」->「8 Maven ビルド…」を選択して「構成の編集」ウインドウを開きます。
そして、構成の編集ウインドウのゴール欄に「package」と入力して実行ボタンを押すとビルド作業が開始します。
ちなみに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ファイルは持ち運べるので、もちろん他のディレクトリに移動・コピーしても実行できます。
〜
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ファイルのファイル名にはバージョン情報が付きますが(「-0.0.1-SNAPSHOT.jar」みたいなの)、これはpom.xmlのversionタグの情報です。
ですので、versionタグのバージョン情報を変更すれば、パッケージビルドで出力されるファイル名も変更されます。開発しているSpring Bootアプリを変更した時には、このバージョン情報を変更してjarファイルを解りやすく更新するのが良いと思います。
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
Spring Bootの画面側(HTML)で使われるJavaテンプレートエンジンのThymeleafで共通部分のHTMLを別ファイル化して共有する方法について説明しています。例えば、ヘッダー、フッター、サイドバーやmetaタグ、linkタグなどのHTMLはどのページでも共通しているのでそれを別ファイルにして、各ページから別ファイル化して共通部分のHTMLを共有するという感じです。
Thymeleafで共通部分のHTMLを別ファイルにする
macOSやLinux環境上でDB(MySQLとか)を使うSpring Bootアプリを動かしたい場合、JDK(JRE)をインストールしてJava実行環境を作れば、上で説明したようにjavaコマンドでSpring Bootアプリを動作させる事ができます。
別ページで、オープンソースのJava実行環境のOpenJDK(OpenJRE)とMySQL(MariaDB)をインストールして、DBと連携したSpring Bootアプリの実行環境の構築手順を説明しているので参考にしてください。
Spring Boot + MySQL(MariaDB)の実行環境を作る