jpackage で Windows アプリケーションのインストーラを作成する


はじめに

Windows で jpackage によるアプリケーションのインストーラ作成の手順をまとめておきます。

jpackage については以下を参照してください。

blog1.mammb.com


Gradle プロジェクト

org.beryx.jlink プラグインを使うのが簡単。

build.gradle.kts は以下のようになる。

plugins {
    application
    id("org.openjfx.javafxplugin") version "0.1.0"
    id("org.beryx.jlink") version "3.0.1"
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation(libs.junit.jupiter)  
    testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

javafx {
    version = "21.0.4"
    modules("javafx.controls")
}

application {
    mainClass = "com.example.App"
    mainModule = "example.app"
}

tasks.named<Test>("test") {
    useJUnitPlatform()
}

jlink {
    options = listOf("--strip-debug", '--compress', '2', "--no-header-files", "--no-man-pages")
    launcher {
        name = "MyApp"
    }
    jpackage {
        skipInstaller = true
    }
}

アプリケーション本体は以下の要領。

package com.example;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class App extends Application {

    @Override
    public void start(Stage stage) {
        Label label = new Label("Hello, World");
        Scene scene = new Scene(new StackPane(label), 320, 240);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }
}

jlink はモジュールを利用することが前提なので、module-info.java を以下のように作成する。

module example.app {
    requires javafx.controls;
    exports com.example;
}

なお、非モジュールライブラリを使う場合には、org.gradlex.extra-java-module-info プラグインなどを使い、非モジュールライブラリをモジュールに変換して使うことになる。


実行パッケージの生成

以下を実行することで、アプリケーションのパッケージが作成できる。

gradlew jpackage

skipInstaller = true を指定しているため、インストーラの生成は行われない(インストーラを生成するには、続く WiX toolset のセットアップ を行う)。

以下のファイルが作成される。

app\build\jpackage\MyApp
  app\
  runtime\
  MyApp.exe

MyApp フォルダをそのまま任意環境に持っていけば、アプリケーションとして動かすことができる。


WiX toolset のセットアップ

インストーラ作成時には Wix 3 が必要(JDK 24 から Wix 4/5 がサポートされる)(Windows Installation eXperience)。

WiX Toolset v3 releases から Download wix311-binaries.zip をダウンロードして解凍する。この時フォルダを作成してその中に解凍すること(そのままデスクトップなどに解凍すると、大量のファイルがデスクトップに直接展開されてしまう)。

ビルドを行うターミナルで wix フォルダに対してパスを設定する。

$ENV:Path += ";C:\<path-to-wix>\wix314-binaries"


インストーラの作成

WiX toolset のセットアップが完了すれば、jlink の設定を以下のように変更する。

jlink {
    // ...
    jpackage {
        appVersion = "0.1.0"
        icon = "${project.rootDir}/app/src/main/resources/icon.ico"
        vendor = "Example Co.,Ltd."
        installerType = "msi"
        installerOptions = listOf("--win-menu", "--win-shortcut", "--win-menu-group", "MyApp")
    }
}

以下を実行することで、インストーラ msi が作成できる。

gradlew jpackage

作成された app\build\jpackage\MyApp-0.0.1.msi を実行することで、アプリケーションをインストールできる。