diff --git a/plugin-build/plugin/src/main/kotlin/io/github/kdroidfilter/nucleus/desktop/application/internal/configureJvmApplication.kt b/plugin-build/plugin/src/main/kotlin/io/github/kdroidfilter/nucleus/desktop/application/internal/configureJvmApplication.kt index 724914f8..0543cfbd 100644 --- a/plugin-build/plugin/src/main/kotlin/io/github/kdroidfilter/nucleus/desktop/application/internal/configureJvmApplication.kt +++ b/plugin-build/plugin/src/main/kotlin/io/github/kdroidfilter/nucleus/desktop/application/internal/configureJvmApplication.kt @@ -708,7 +708,8 @@ private fun JvmApplicationContext.configurePackageTask( packageTask.packageDescription.set(executables.description) packageTask.packageCopyright.set(executables.copyright) packageTask.packageVendor.set(executables.vendor) - packageTask.packageVersion.set(packageVersionFor(packageTask.targetFormat)) + // jpackage app-image: use the jpackage-safe version. + packageTask.packageVersion.set(jpackageVersionFor(packageTask.targetFormat)) } val dirSuffix = if (sandboxed) "-sandboxed" else "" diff --git a/plugin-build/plugin/src/main/kotlin/io/github/kdroidfilter/nucleus/desktop/application/internal/packageVersions.kt b/plugin-build/plugin/src/main/kotlin/io/github/kdroidfilter/nucleus/desktop/application/internal/packageVersions.kt index e100fbfd..d373b406 100644 --- a/plugin-build/plugin/src/main/kotlin/io/github/kdroidfilter/nucleus/desktop/application/internal/packageVersions.kt +++ b/plugin-build/plugin/src/main/kotlin/io/github/kdroidfilter/nucleus/desktop/application/internal/packageVersions.kt @@ -17,6 +17,21 @@ internal fun JvmApplicationContext.packageVersionFor(targetFormat: TargetFormat) ?: "1.0.0" } +/** + * Version used when jpackage builds the app-image (`--app-version`). + * + * jpackage is the only [io.github.kdroidfilter.nucleus.desktop.application.dsl.PackagingBackend.JPACKAGE] + * step ([TargetFormat.RawAppImage]) and enforces strict platform version rules — notably Windows + * rejects SemVer pre-release/build metadata such as `2.3.5-beta.7`. All real installer formats run + * through electron-builder and keep the full SemVer via [packageVersionFor]. + */ +internal fun JvmApplicationContext.jpackageVersionFor(targetFormat: TargetFormat): Provider = + packageVersionFor(targetFormat).map { it.toJpackageVersion() } + +// jpackage rejects SemVer pre-release/build metadata; keep only the MAJOR.MINOR.PATCH core. +private fun String.toJpackageVersion(): String = + substringBefore('-').substringBefore('+') + @Suppress("CyclomaticComplexMethod") // Exhaustive when on TargetFormat enum private fun JvmApplicationDistributions.packageVersionFor(targetFormat: TargetFormat): String? { val formatSpecificVersion: String? =