exe4jとInno Setupを活用したJavaデスクトップアプリの実行ファイル化とインストーラー作成手順

Javaアプリケーションのスタンドアロン化と配布パッケージ構築

本ガイドでは、Java Swingで開発したGUIアプリケーションをWindows環境で依存関係なしに実行可能な形式に変換し、最終的にインストーラーパッケージを生成する一連の工程を解説します。exe4jによるJREバンドルとネイティブ実行ファイル化、およびInno Setupを用いたインストールスクリプトのコンパイルを組み合わせます。

1. 状態保存機能を持つサンプル実装

ウィンドウ構成をシリアライズしてファイルへ保存・復元するアプリケーションを準備します。以下のコードでは、Serializableインターフェースを実装したフレームと、I/O処理をラップした状態管理クラスを分離して構成しています。

package app.state;

import java.awt.BorderLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.nio.file.Paths;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

class StateManager {
    private final String stateFilePath = Paths.get(System.getProperty("user.home"), "app_state.bin").toString();

    public void exportState(AppWindow window) throws IOException {
        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(stateFilePath))) {
            out.writeObject(window);
        }
    }

    public AppWindow importState() throws IOException, ClassNotFoundException {
        try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(stateFilePath))) {
            return (AppWindow) in.readObject();
        }
    }
}

public class AppWindow extends JFrame implements ActionListener, Serializable {
    private static final long serialVersionUID = 1L;

    private final JButton btnExport = new JButton("状態を保存");
    private final JButton btnImport = new JButton("状態を復元");
    private final JTextArea textArea = new JTextArea("初期テキスト");
    private transient StateManager stateMgr = new StateManager();

    public AppWindow() {
        setupLayout();
        btnExport.addActionListener(this);
        btnImport.addActionListener(this);
    }

    private void setupLayout() {
        setTitle("状態管理デモ");
        setLayout(new BorderLayout());
        textArea.setLineWrap(true);
        add(new JScrollPane(textArea), BorderLayout.CENTER);
        JPanel controlPanel = new JPanel();
        controlPanel.add(btnExport);
        controlPanel.add(btnImport);
        add(controlPanel, BorderLayout.SOUTH);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(220, 160);
        setLocationRelativeTo(null);
        setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/assets/icon.png")));
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        try {
            if (e.getSource() == btnExport) {
                stateMgr.exportState(this);
                System.out.println("状態が保存されました");
            } else {
                AppWindow restored = stateMgr.importState();
                restored.stateMgr = new StateManager();
                restored.setVisible(true);
                this.dispose();
            }
        } catch (Exception ex) {
            System.err.println("状態の保存または読み込み中にエラーが発生しました: " + ex.getMessage());
        }
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(() -> new AppWindow().setVisible(true));
    }
}

2. JARファイルのエクスポートとマニフェスト定義

ビルド成果物をJAR形式に出力します。外部リソース(画像や設定ファイル)はこの段階では除外し、コンパイル済みクラスのみを対象とします。出力ディレクトリ直下にMETA-INF/MANIFEST.MFを作成し、アプリケーションのエントリポイントを明記します。

Manifest-Version: 1.0
Main-Class: app.state.AppWindow
Created-By: Java Developer

Class-Pathの指定は不要です。実行環境の検索順序とメインクラスは後段のツール側で設定するためです。

3. リソースとJREの配置構成

生成されたJARファイルと同じディレクトリレベルに、画像リソースフォルダを配置します。さらに、ターゲットマシンにJava実行環境がインストールされていない場合でも動作を保証するため、適切なアーキテクチャ(Win32/Win64)のJREディレクトリを同階層へコピーします。これにより、exe4jがJREをバンドルする基盤が整います。

4. exe4jによるネイティブ実行ファイル化

exe4jのプロジェクトウィザードを起動し、以下のパラメータを設定してビルドを実行します。

  1. Application Type: Regular を選択し、GUIウィンドウモードを有効化します。
  2. Executable Output: 出力先ディレクトリと実行ファイル名(例: demo.exe)を指定します。
  3. Java Invocation: 生成したJARファイルを追加し、Main Classフィールドにapp.state.AppWindowを入力します。
  4. JRE Search Sequence: 同階層に配置したJREパスをMinimum Versionに合わせて優先検索パスとして登録します。Use JRE from directoryオプションを有効化することで、ローカルのシステム環境変数に依存しないポータブルな実行形式が得られます。

コンパイルが完了すると、指定パスに単一の実行可能ファイルが出力されます。この時点で元のJARおよびJREディレクトリはパッケージ内に埋め込まれているため、配布用フォルダからは削除可能です。

5. Inno Setupによるインストールスクリプトの生成

Inno Setup Compilerを起動し、スクリプトウィザードに従ってインストールパッケージを構築します。

  1. アプリケーションメタデータ: 製品名、バージョン番号、発行元、公式サポートURLを入力します。
  2. インストールターゲット: デフォルトの展開先を{pf}\MyApplicationまたはユーザー選択モードに設定します。
  3. ファイル割り当て: exe4jで出力した.exeファイルをメインインストールファイルとして登録します。必要に応じてライセンス条項や初期設定ファイルを追加します。
  4. ショートカットとレジストリ: デスクトップおよびスタートメニューへのショートカット作成を有効化し、アンインストール情報の登録を許可します。
  5. スクリプトコンパイル: ウィザードを確定すると.issファイルが生成されます。Inno Setup IDEで開き、Compileコマンドを実行して最終的なインストーラーバイナリを出力します。

コンパイル処理が正常に終了すると、出力フォルダに自己展開型のインストールパッケージが配置されます。このパッケージはターゲット環境上で実行され、指定されたディレクトリ構造へファイルの展開およびシステムレジストリへの登録を自動的に行います。

タグ: exe4j Inno Setup Java Swing Java Serialization Windows Installer

8月14日 21:03 投稿