Javaをexe化してみる(4)バッチファイルで自動化しパッケージングする

はじめに:バッチ化で自動化する

前回お話しした「5段構え」の工程。
これを毎回手入力していては、大変です。
そこで、これらすべての工程をひとつのバッチファイルにまとめました。
試行錯誤して作成したバッチファイルを公開します。

いろいろと苦労して動くようになっています。その辺りも含めて解説していきます。

バッチファイルの全コード


@echo off
setlocal
echo === JavaFX + JINPUT EXE Build System (JDK 25) ===

REM (1)事前準備
REM 環境変数で一括管理
REM 自分自身の環境に合わせて修正してください
echo [1-1] 環境変数設定...
set JAVA_HOME=C:\Java\jdk-25.0.1
set JFX_SDK=C:\Java\javafx-sdk-25.0.1
set JFX_MODS=C:\Java\javafx-jmods-25.0.1
set JINPUT_JAR=jinput-2.0.9.jar
set JINPUT_NATIVE=jinput-2.0.9-natives-all
set APP_NAME=SKK4_FX
set MAIN_CLASS=KApplicationSKK
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" ^
  --module-path "%JFX_SDK%\lib" ^
  --add-modules javafx.controls,javafx.media ^
  -classpath ".;%JINPUT_JAR%" ^
  -d out *.java

REM (3)「dist」フォルダへjarファイルやJINPUTモジュールを集約
echo [3-1] distフォルダ構築 jarファイル作成中。イメージファイルと音楽系ファイルも一緒にjar化...
echo Main-Class: %MAIN_CLASS% > manifest.txt
echo Class-Path: %JINPUT_JAR% >> manifest.txt
"%JAVA_HOME%\bin\jar" cvfm dist\%APP_NAME%.jar manifest.txt -C out . image sound

echo [3-2] distフォルダ構築 JINPUTコピー...
copy "%JINPUT_JAR%" "dist\"
xcopy /Y "%JINPUT_NATIVE%\*.dll" "dist\"

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%" ^
  --module-path "%JFX_MODS%" ^
  --add-modules javafx.controls,javafx.media,java.logging ^
  --vendor "KIN"

REM (5)変更が必要になりそうなプロパティ系ファイルを別でコピー
echo [5] リソース配置中...
echo ストーリーファイルとパッドは外出ししてあります。
echo パッドの設定は、適宜、修正ください。
copy "KStorySKK.txt" "release\%APP_NAME%\"
copy "Input.properties" "release\%APP_NAME%\"

echo === 全工程完了! release\%APP_NAME% 内の %APP_NAME%.exe を実行してください ===
pause

(1)事前準備

環境変数で一括管理

JDKの場所やJavaFXのパス、JINPUTのバージョンなどを冒頭で変数(set)にまとめています。
環境が変わっても、ここを書き換えるだけで使い回せるようにしました。

必要なフォルダを作成

パッケージングしていくために必要なフォルダを作成します。
out フォルダ:classファイルの置き場。jarファイルにする元ネタになります。
dist フォルダ:パッケージング前のまとめ置き場。
release フォルダ:完成した EXE パッケージが出力される場所。

(2)コンパイル

いつもやっている(?)コンパイルをします。
JavaFXで考慮が必要なクラスパスを通したり、JINPUT系もコンパイルできるようにクラスパスに追加します。
出力先はoutフォルダにしています。
ソースコード(.java)と成果物(.class)を混ざらないように整理しておくことで、ビルドミスを防ぐ工夫です。

(3)「dist」フォルダへjarファイルやJINPUTモジュールを集約

jpackageに渡す前に、一度、distフォルダに必要なJARとJINPUT系のDLLをすべて集めています。
「材料は一箇所にまとめてからパッケージ(jpackage)するよ~」という、整理整頓の工程です。
jarファイルの中にイメージファイルと音楽系ファイルも一緒にjar化しています。

(4)パッケージング。EXE化

ここでEXE化していきます。
いろいろとオプションを入れててややこしいですが、なんとなくは分かるのではないでしょうか?

一部、説明しますが、
–add-modules javafx.controls,javafx.media,java.logging ^
については、デフォルトのモジュール群には無いモジュール群を一緒にパッケージングしていきます。
前半部分は見て分かる通りjavafx系のモジュールを指定しています。
後半部分がポイントですが、java.logging を加えています。
JavaFXの内部でログ出力機能が使われていることがあり、
これを含めないと実行時にエラーになる場合があるため、安全策として追加しています。

(5)変更が必要になりそうなプロパティ系ファイルを別でコピー

一部プロパティファイルについて、カスタマイズする可能性があるファイルについては、外だしにしてあります。
KStorySKK.txt ・・・ ストーリーファイル。少しくらいゲーム性を変えるならここで可能。
Input.properties ・・・ パッドのボタンを割り当てます。パッドによってけっこう違うみたい。

もしEXEを実行して動かなかったら、コマンドプロンプト(win-console)のメッセージをチェックしてみてください。

きんが作ったEXEモジュール

音楽ファイルも入っていて、120Mくらいあります。

SKK4_FX_EXE.zip

シリーズリンク

Javaコンパイルしたモジュールをexe化してみる(1)Javaがexe化するに至った経緯を振り返る。
Javaコンパイルしたモジュールをexe化してみる(2)EXE化への「5段構え」の工程
Javaをexe化してみる(3)環境構築とJMODSを追加する
Javaをexe化してみる(4)バッチファイルで自動化しパッケージングする

Exeができたイメージ

実行時のコンソール(わざと表示していますが、非表示にすることも可能です)

画面1-きんが作った戦艦

画面2-シャチホコボーナス

Youtube公開動画
https://youtu.be/pTQt_pPXgqc

シェアしていただけるとうれしいです。