Windows で jpackage コンソールアプリケーションを作る時は --win-console オプションが必要

少しはまったのでメモ。

Gradle org.beryx.jlink プラグインで、ランタイムがバンドルされたアプリケーションを作成する場合、以下のような build.gradle.kts を作成する。

plugins {
    application
    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)
    }
}

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

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

jlink {
    launcher {
        name = "app"
    }
    jpackage {
        skipInstaller = true
    }
}

以下のようにすれば、実行イメージが作成できる。

./gradlew jlink

イメージ内にバッチファイルが作成されるので、以下のように実行できる。

app\build\image\bin\app.bat

以下のようにすれば、exe ファイルが作成できる。

./gradlew jpackage

exe ファイルを実行すると、

app\build\jpackage\app\app.exe

何事もなく終了するか、以下のような「Failed to launch JVM」エラーとなる。

Windows のコンソールアプリケーションには以下のオプション指定が必要なため。

org.beryx.jlink プラグインの場合は imageOptions = listOf("--win-console") を指定する必要がある。

以下のようになる。

plugins {
    application
    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)
    }
}

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

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

jlink {
    launcher {
        name = "app"
    }
    jpackage {
        imageOptions = listOf("--win-console")
        skipInstaller = true
    }
}

なお、skipInstaller を指定しない場合は、インストーラが作成される。ただし、WiX を別途インストールしておく必要がある。

blog1.mammb.com