前回の「(1)」では概要をお伝えしましたが、
今回は実際に配布可能なExeファイルを作るための「自動化バッチ」の中身を詳しく解説します。
1. なぜ「jpackage」なのか?
Java 14から導入された jpackage は、**「実行環境(JRE)を同梱できる」**点にあります。
以前のようにユーザーに「Javaをインストールしてください」とお願いする必要がなく、
配布したフォルダ内のexeを叩くだけで動く、現代的な配布形態が可能です。
ただ、ファイルサイズがけっこう大きくなります。
2. ビルドを行うバッチファイル(makeExe.bat)
私が今回のシミュレーターで使用したバッチファイルを紹介します。
@echo off
setlocal
echo === Java EXE Build System (JDK 25) ===
REM (1)事前準備
REM 環境変数で一括管理
REM 自分自身の環境に合わせて修正してください
echo [1-1] 環境変数設定...
set JAVA_HOME=C:\Java\jdk-25.0.1
set APP_NAME=SolarSystemSim
set MAIN_CLASS=SolarSystemSim
set VERSION=1.0.0
REM 必要なフォルダを作成
echo [1-2] フォルダ作成...
if not exist "out" mkdir "out"
if not exist "dist" mkdir "dist"
if not exist "release" mkdir "release"
REM (2)コンパイル
echo [2] コンパイル中...
"%JAVA_HOME%\bin\javac" ^
-d out *.java
REM (3)「dist」フォルダへjarファイルを集約
echo [3] distフォルダ構築 jarファイル作成中。
echo Main-Class: %MAIN_CLASS% > manifest.txt
"%JAVA_HOME%\bin\jar" cvfm dist\%APP_NAME%.jar manifest.txt -C out .
REM (4)パッケージング。EXE化
echo [4] パッケージ作成中 (app-image)...
"%JAVA_HOME%\bin\jpackage" ^
--name "%APP_NAME%" ^
--type app-image ^
--win-console ^
--input dist ^
--dest "release" ^
--main-jar "%APP_NAME%.jar" ^
--main-class "%MAIN_CLASS%" ^
--vendor "KIN"
echo === 全工程完了! release\%APP_NAME% 内の %APP_NAME%.exe を実行してください ===
pause
3. ポイント解説
jar化は必須
jpackageはJARファイルを入力として受け取るため、この工程は必須です。
この際、マニフェストファイルを使用して、アプリの起動地点(Main-Class)を明示するのがポイントです。
–type app-image
インストーラーではなく、実行に必要なファイル群を一つのフォルダにまとめます。ポータブルに持ち運びたい場合に最適です。
インストーラにしたい場合は、
–type exe
–type msi
にしてください。
わたしはインストールするまではちょっと・・・って感じでフォルダにまとめるところまでにしています。
–win-console の役割
これを入れると、アプリ(exe)を起動した瞬間に、背後で「コマンドプロンプト(黒い画面)」が一緒に立ち上がるようになります。
入れるメリット(デバッグ用):
プログラムの中で System.out.println(“天体の計算開始…”); のように書いているメッセージが、その黒い画面にリアルタイムで表示されます。
もしエラーで落ちた時も、そこにエラーメッセージ(スタックトレース)が残るので、「なぜ動かないのか」を突き止めるのに必須です。
入れないメリット(製品用):
純粋にシミュレーターの画面だけがポーンと立ち上がります。
一般ユーザーからすると「余計な黒い画面が出ない」ので、見た目がスッキリして「完成品」っぽく見えます。
デバッグが済んだら、取っちゃう方がスマートでしょうね~。
今回の記事まとめ
Javaで太陽系天体シミュレーター&JavaをExe化してみました。(Java21以降対応)
Javaをexe化してみる(2)- jpackageの活用 と 自動化バッチの紹介 -
Javaのバーチャルスレッドを利用してみた(3)感想とゲーム利用の有効性について考察
Youtubeに載せました♪
https://youtu.be/NPsgNbhEtds