Comparison with Other JVM Packaging Tools¶
About this comparison
This comparison was generated with the assistance of Claude Code (Anthropic's AI coding agent). Every factual claim includes a source link to official documentation, GitHub repositories, or vendor pages. Nucleus-specific claims are verified against the project source code.
Last updated: March 2026.
Executive Summary¶
This page evaluates Nucleus against 10 competing JVM packaging tools across 13 feature dimensions.
Key findings:
- Nucleus offers the broadest package format coverage of any JVM tool (16 distributable formats), surpassing Conveyor (6), install4j (7), jpackage (6), and Compose Multiplatform (6).
- Nucleus is the only JVM packaging tool combining auto-update runtime, AOT caching, GraalVM Native Image packaging, store distribution pipeline, native UI components (decorated windows with JBR and JNI backends, dark mode detection, Linux HiDPI), deep link/single instance management, and native OS SSL integration in one toolkit.
- Nucleus is the first JVM packaging tool with integrated GraalVM Native Image support — compile Compose Desktop apps into standalone native binaries with ~0.5s cold boot, ~100–150 MB memory usage, and smaller bundle sizes (no bundled JRE). Full packaging pipeline (DMG, NSIS, DEB) for native images.
- Nucleus has the most comprehensive CI/CD solution for JVM desktop apps, with 6 composite GitHub Actions covering matrix builds, universal macOS binaries, MSIX bundles, GraalVM native image builds, and release publishing.
- Tradeoffs: Nucleus requires platform-specific CI runners (no cross-compilation), is Gradle-only, and is a younger project with a smaller community than established tools.
Rankings¶
| Tier | Tool | Score | License |
|---|---|---|---|
| S | Nucleus | 90 | MIT (free) |
| B | install4j | 65 | Proprietary ($2,199+/dev) |
| B- | Conveyor | 62 | Proprietary ($45/mo) |
| C | jDeploy | 49 | Apache 2 (free) |
| C | Compose Multiplatform | 42 | Apache 2 (free) |
| C | jpackage (JDK built-in) | 38 | JDK (free) |
| C- | JavaPackager | 36 | GPL 3 (free) |
| C- | Badass plugins | 35 | Apache 2 (free) |
| D | Launch4j | 22 | BSD (free) |
| D | Packr | 22 | Apache 2 (dormant) |
| F | JSmooth | 11 | Abandoned |
Scoring: each of 13 dimensions rated 0–10, total = raw sum / 130 × 100. See Scoring Matrix for details.
Competitors Overview¶
| Tool | Type | Version | Status | Source |
|---|---|---|---|---|
| jpackage | JDK built-in CLI | JDK 25 | Active | Oracle docs |
| Conveyor (Hydraulic) | CLI + Gradle plugin | v21.1 | Active | conveyor.hydraulic.dev |
| install4j (ej-technologies) | IDE + Gradle/Maven plugin | v12.0.2 | Active | ej-technologies.com |
| jDeploy | CLI + GitHub Action | v6.0.16 | Active | jdeploy.com |
| Compose Multiplatform (JetBrains) | Gradle plugin | v1.10.1 | Active | jetbrains.com |
| Launch4j | GUI/CLI (Windows EXE wrapper) | v3.50 | Low activity | launch4j.sourceforge.net |
| JavaPackager | Gradle/Maven plugin | v1.7.6 | Semi-maintained | GitHub |
| Badass-jlink / Badass-runtime | Gradle plugins | v3.2.1 / v2.0.1 | Active | GitHub |
| Packr (libGDX) | CLI | v4.0.0 | Dormant | GitHub |
| JSmooth | GUI (Windows EXE wrapper) | — | Abandoned | — |
Feature-by-Feature Comparison¶
1. Platform & Architecture Coverage¶
| Tool | Win x64 | Win ARM64 | macOS x64 | macOS ARM64 | macOS Universal | Linux x64 | Linux ARM64 | Score |
|---|---|---|---|---|---|---|---|---|
| Nucleus | ✅ | ✅ | ✅ | ✅ | ✅ (CI action) | ✅ | ✅ | 10 |
| Conveyor | ✅ | ✅ | ✅ | ✅ | ❌¹ | ✅ | ⚠️² | 8 |
| install4j | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 10 |
| jpackage | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | 8 |
| jDeploy | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | 8 |
| Compose MP | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | 5 |
| JavaPackager | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | 5 |
| Badass plugins | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | 8 |
¹ Conveyor produces separate per-architecture downloads, not fat binaries (docs).
² Conveyor has app.linux.aarch64 config keys (docs), but Linux ARM64 is listed as planned in the FAQ (FAQ).
Sources
- Nucleus: macOS universal binary via
build-macos-universalCI action usinglipo - Conveyor: Package formats, macOS config, Linux config
- install4j: Features page — "compile installers for all platforms on any of these platforms"
- jpackage: Oracle man page — must build on target OS
- jDeploy: FAQ — "build native installers for Mac, Windows, and Linux on any platform"
- Compose MP: Native distributions — wraps jpackage, same platform constraints
2. Package Format Coverage¶
| Tool | DMG | PKG | NSIS | MSI | MSIX/AppX | Portable | DEB | RPM | AppImage | Snap | Flatpak | Archives | Total |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Nucleus | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ZIP, TAR, 7Z | 16 |
| Conveyor | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ZIP, TAR + EXE¹ | 6 |
| install4j | ✅ | ❌ | ❌ | ✅² | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | TAR, shell | 7 |
| jpackage | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | 6 |
| jDeploy | ❌³ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | EXE, TAR | 4 |
| Compose MP | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | 6 |
| JavaPackager | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ZIP | 8 |
| Score | Rating |
|---|---|
| Nucleus: 16 formats | 10 |
| JavaPackager: 8 | 5 |
| install4j: 7 | 5 |
| Conveyor: 6 | 4 |
| jpackage: 6 | 4 |
| Compose MP: 6 | 4 |
| jDeploy: 4 | 3 |
¹ Conveyor's Windows EXE is a custom ~500 KB installer that drives Windows Deployment Engine APIs — not NSIS (docs). DMG is deliberately not supported (FAQ). ² install4j MSI is an optional wrapper around the native EXE installer (docs). ³ jDeploy DMG requires a separate GitHub Action + macOS runner (jdeploy-action-dmg).
Sources
- Nucleus:
TargetFormat.kt— 17 enum values (16 distributable +RawAppImageintermediate) - Conveyor: Package formats, Output formats FAQ — MSIX, EXE, ZIP (Windows); signed .app in ZIP (macOS); DEB, tar.gz (Linux). No DMG, PKG, RPM, NSIS, AppImage, Snap, Flatpak.
- install4j: Media files — EXE, MSI wrapper, DMG, .app, RPM, DEB, tar.gz, shell installer. No PKG, NSIS, AppX.
- jpackage: Oracle man page —
--type: app-image, dmg, pkg, exe, msi, deb, rpm - jDeploy: GitHub, FAQ — EXE, .app/tar.gz, DEB; DMG via separate action
- Compose MP: Native distributions — wraps jpackage formats
- JavaPackager: GitHub README — EXE (Inno Setup/WinRun4J), MSI (WiX), DMG, PKG, DEB, RPM, AppImage, ZIP
Nucleus leads by leveraging electron-builder as its packaging backend: jpackage creates the app-image, then electron-builder's --prepackaged mode produces all 16 distributable formats. This hybrid architecture is unique in the JVM ecosystem.
3. Auto-Update System¶
| Tool | Runtime Library | Updater Backend | Channels | Delta Updates | Verification | Score |
|---|---|---|---|---|---|---|
| Nucleus | ✅ NucleusUpdater |
GitHub / Generic URL | 3 (latest/beta/alpha) | ❌ | SHA-512 | 9 |
| Conveyor | ✅ (OS-native) | Sparkle 2 / MSIX / apt | ✅ | ✅ (Win+Mac) | ✅ | 10 |
| install4j | ✅ (updater API) | Custom | ✅ | ❌ | ✅ | 9 |
| jDeploy | ✅ (built-in) | npm / GitHub Releases | ❌ | ❌ | ❌ | 6 |
| jpackage | ❌ | — | — | — | — | 0 |
| Compose MP | ❌ | — | — | — | — | 0 |
Sources
- Nucleus:
NucleusUpdater.kt—GitHubProviderandGenericProvider; SHA-512 verification; 9 self-updatable format types (EXE, NSIS, MSI, DMG, ZIP, AppImage, DEB, RPM, NsisWeb) - Conveyor: Update modes — Sparkle 2 on macOS (delta patches for 5 previous versions), MSIX native on Windows (64 KB chunk delta), apt on Linux. Understanding updates
- install4j: Features — built-in auto-update with configurable strategies
- jDeploy: Substack — auto-detects new versions on launch
Conveyor's delta update system is a genuine differentiator: a single-line change in an Electron app results in ~31 KB (macOS) or ~115 KB (Windows) updates vs ~100 MB full downloads (source). Nucleus uses full-file downloads but compensates with a rich runtime API (progress tracking, channel management, restart-on-update).
4. Code Signing & Notarization¶
| Tool | macOS Signing | macOS Notarization | Windows PFX | Azure Trusted Signing | Other Cloud HSMs | Score |
|---|---|---|---|---|---|---|
| Nucleus | ✅ | ✅ | ✅ | ✅ | ❌ | 10 |
| Conveyor | ✅ | ✅ | ✅ (+ self-sign + SSL certs) | ✅ | ✅ (6 providers) | 10 |
| install4j | ✅ | ✅ | ✅ | ❌ | ❌ | 8 |
| jDeploy | ✅¹ | ✅¹ | ✅¹ | ❌ | ❌ | 7 |
| jpackage | ✅ (--mac-sign) |
✅ (--mac-app-store) |
❌ | ❌ | ❌ | 3 |
| Compose MP | ✅ | ✅ | ❌ | ❌ | ❌ | 5 |
| JavaPackager | ✅ | ❌ | ✅ (Jsign) | ❌ | ❌ | 3 |
¹ jDeploy pre-signs and notarizes installers using its own certificate; optional custom signing via GitHub Action (FAQ).
Sources
- Nucleus:
MacOSSigningSettings.kt,WindowsSigningSettings.kt— Azure Trusted Signing viaazureTenantId,azureEndpoint,azureCertificateProfileName - Conveyor: Keys and certificates — macOS notarization (App Store Connect API keys), Windows self-signing, Azure Trusted Signing, Azure Key Vault, AWS KMS, SSL.com eSigner, DigiCert ONE, Google Cloud KMS, HSMs (SafeNet, YubiKey)
- install4j: Features — cross-platform signing and notarization
- jpackage: Oracle man page —
--mac-sign,--mac-signing-key-user-name,--mac-app-store - Compose MP: Native distributions — macOS signing and notarization DSL
- JavaPackager: v1.7.4 release — Jsign 5.0 for Windows signing
Conveyor has the broadest signing provider support (6 cloud HSM services). Nucleus focuses on the two most common paths (PFX + Azure Trusted Signing) with CI-ready composite actions for secret management.
5. CI/CD Integration¶
| Tool | Pre-built Actions | Matrix Builds | Universal Binary | MSIX Bundle | Release Publishing | Score |
|---|---|---|---|---|---|---|
| Nucleus | ✅ (6 actions) | ✅ (6 runners) | ✅ | ✅ | ✅ | 10 |
| Conveyor | ⚠️ (examples) | ❌ (single machine) | ❌ | ❌ | ✅ (GH/SSH/S3) | 6 |
| install4j | ❌ (CLI only) | ❌ | ❌ | ❌ | ❌ | 3 |
| jDeploy | ✅ (GitHub Action) | ❌ | ❌ | ❌ | ✅ (auto) | 5 |
| Compose MP | ❌ | ❌ | ❌ | ❌ | ❌ | 1 |
Sources
- Nucleus: 6 composite actions in
.github/actions/—setup-nucleus(JBR or GraalVM Liberica NIK + tools),setup-macos-signing(keychain + P12),build-macos-universal(lipo merge + re-sign),build-windows-appxbundle(MakeAppx + SignTool),generate-update-yml(SHA-512 metadata),publish-release(gh release create). Since v1.3.0,setup-nucleussupports agraalvmoption to install BellSoft Liberica NIK instead of JBR, enabling GraalVM Native Image builds in CI. - Conveyor: CI tutorial — example workflows for GitHub Actions (build, deploy-to-gh, deploy-to-ssh). Conveyor runs on a single machine since it cross-compiles.
- install4j: What's new — CLI mode for CI, no pre-built actions
- jDeploy: GitHub —
jdeploy-actionfor automated builds on tag push
Nucleus's CI pipeline is its strongest JVM differentiator. No other JVM tool provides ready-to-use GitHub Actions for the complete build → sign → bundle → publish workflow. Conveyor avoids matrix builds entirely by cross-compiling from a single machine — a fundamentally different (and simpler) approach.
6. Build System Integration¶
| Tool | Gradle | Maven | CLI | Other | Score |
|---|---|---|---|---|---|
| Nucleus | ✅ (plugin) | ❌ | ❌ | — | 6 |
| Conveyor | ✅ (plugin) | ✅ (via CLI) | ✅ | HOCON config | 9 |
| install4j | ✅ | ✅ | ✅ (IDE + CLI) | Ant | 10 |
| jDeploy | ❌ | ✅ | ✅ | npm | 8 |
| Compose MP | ✅ (plugin) | ❌ | ❌ | — | 6 |
| JavaPackager | ✅ | ✅ | ❌ | — | 7 |
| Badass plugins | ✅ | ❌ | ❌ | — | 6 |
| jpackage | ❌ | ❌ | ✅ (JDK built-in) | — | 4 |
Sources
- Nucleus: Gradle plugin (
io.github.kdroidfilter.nucleus), no Maven or CLI support - Conveyor: Gradle/Maven integration — open-source Gradle plugin (Gradle 7+); Maven via
mvn dependency:build-classpathCLI integration; standaloneconveyorCLI - install4j: Features — visual IDE + CLI + Gradle + Maven + Ant plugins
- jDeploy: GitHub — CLI tool, Maven integration, npm package
- JavaPackager: GitHub — Gradle + Maven plugins
Nucleus is Gradle-only, which suits its Compose Desktop audience but limits adoption by Maven or CLI-only users. Conveyor and install4j offer the most flexibility.
7. Runtime Optimization¶
| Tool | JLink | ProGuard | AOT Cache (Leyden) | GraalVM Native Image | Custom JVM | CA Cert Patching | Score |
|---|---|---|---|---|---|---|---|
| Nucleus | ✅ | ✅ | ✅ (JDK 25+) | ✅ (experimental) | ✅ (JBR / Liberica NIK) | ✅ (declarative DSL) | 10 |
| Conveyor | ✅ (auto) | ❌ | ❌ | ⚠️ (workaround¹) | ✅ (6 vendors) | ✅ (app.jvm.additional-ca-certs) |
6 |
| install4j | ✅ | ❌ | ❌ | ❌ | ✅ | ❌² | 5 |
| jpackage | ✅ | ❌ | ❌ | ❌ | ✅ | ⚠️³ | 4 |
| Compose MP | ✅ | ✅ | ❌ | ❌ | ✅ | ❌⁴ | 6 |
| Badass plugins | ✅ | ❌ | ❌ | ❌ | ✅ | ⚠️⁵ | 5 |
¹ Conveyor can package pre-built GraalVM native binaries by pointing app.jvm.extract-native-libraries at a native-image output and using a fake JDK, but this is a manual workaround — not an integrated build pipeline (discussion #66).
² install4j has no keytool or cacerts DSL. Workaround: pre-patch a JRE, re-archive as .tar.gz, point install4j at the custom bundle (pre-created JRE bundles docs).
³ jpackage's --resource-dir cannot replace cacerts (it only overrides packaging templates). The supported approach is to run keytool -importcert against a jlink image and pass it via --runtime-image; a post-image script hook (.sh/.wsf) could also be used but is undocumented for certs.
⁴ Compose Multiplatform's jpackageResources directory is internal and cleared on every build; no user-accessible mechanism to override cacerts. Same --runtime-image workaround as jpackage applies but is not exposed in the DSL.
⁵ badass-jlink exposes no cert DSL, but its task hook (tasks.named("jlink").doLast { … }) gives access to the staged runtime image before jpackage consumes it — the cleanest manual workaround available.
Sources
- Nucleus:
AbstractGenerateAotCacheTask.kt— Project Leyden via-XX:AOTCacheOutput(JDK 25+);ProguardSettings.kt— ProGuard 7.7.0 default;AbstractJLinkTask.kt— jlink with strip-debug, compression;AbstractPatchCaCertificatesTask.kt— copies JLink runtime, runs keytool to import PEM/DER certificates intolib/security/cacerts;graalvm-runtime— GraalVM Native Image bootstrap withGraalVmInitializer.initialize(), platform-specific reachability metadata, font substitution, and Skiko native library extraction. Requires BellSoft Liberica NIK 25 (full). Packaging viapackageGraalvmDmg,packageGraalvmNsis,packageGraalvmDebtasks. - Conveyor: JVM config — automatic jlink;
app.jvm.additional-ca-certskey imports extra certificates into the bundled JDK'scacerts; JDK stdlib — 6 JDK vendors (Corretto, Zulu, Temurin, JBR, Microsoft, OpenJDK) - install4j: JRE bundles, createbundle CLI — no cert patching DSL; manual via pre-patched JRE bundle
- jpackage: Override resources —
--resource-dirlimited to packaging templates; cert patching requires--runtime-imagewith a pre-patched jlink output - Compose MP: Native distributions — ProGuard + jlink; no CA cert DSL;
jpackageResourcesinternal and cleared on each build (open PR #2331 for--resource-direxposure, not merged) - Badass-jlink: User guide — task hooks on
jlinktask allowdoLastkeytool invocation against staged image
Only Nucleus and Conveyor provide declarative, first-class CA cert patching: a single DSL property that automatically patches the bundled JVM's cacerts without any manual keytool scripts. Nucleus is the only JVM packaging tool with integrated Project Leyden AOT cache support, providing dramatically faster cold startup without requiring GraalVM. As of v1.3.0, Nucleus also offers experimental GraalVM Native Image support — compiling Compose Desktop apps into standalone native binaries with ~0.5s cold boot, ~100–150 MB memory usage, and no bundled JRE. This provides three startup tiers: standard JVM (~3–5s), AOT cache via Leyden (~1.5s), and native image (~0.5s).
8. Cross-Compilation¶
| Tool | Build All From One OS | Score |
|---|---|---|
| Conveyor | ✅ (any OS → all platforms) | 10 |
| install4j | ✅ (any OS → all platforms) | 10 |
| jDeploy | ✅ (any OS → all platforms) | 10 |
| Nucleus | ❌ (per-OS runners required) | 3 |
| jpackage | ❌ | 0 |
| Compose MP | ❌ | 0 |
| Badass plugins | ❌ | 0 |
Sources
- Conveyor: Homepage — "build packages from any OS, sign and notarize Mac apps from Linux"
- install4j: Homepage — "compile installers for all platforms on any of these platforms"
- jDeploy: FAQ — "build native installers for Mac, Windows, and Linux on any platform"
- Nucleus:
TargetFormat.ktline 48 —isCompatibleWithCurrentOScheck; packaging tasks disabled for non-matching OS
This is Nucleus's weakest dimension. However, Nucleus mitigates it with its 6-runner CI matrix — the pipeline handles cross-platform builds automatically.
9. Installer Customization¶
| Tool | Windows Custom UI | DMG Layout | License Dialog | Components | Scripts | Score |
|---|---|---|---|---|---|---|
| Nucleus | ✅ (full NSIS DSL) | ✅ (extensive) | ✅ | ✅ | ✅ | 9 |
| install4j | ✅ (GUI designer) | ✅ | ✅ | ✅ | ✅ | 10 |
| Conveyor | ❌ (MSIX only) | ❌ | ❌ | ❌ | ❌ | 1 |
| jpackage | Partial | Minimal | ❌ | ❌ | ❌ | 3 |
| Compose MP | ❌ | Minimal | ❌ | ❌ | ❌ | 2 |
| JavaPackager | ✅ (Inno Setup) | ✅ | ✅ | ❌ | ❌ | 4 |
Sources
- Nucleus:
NsisSettings.kt— 16 properties:oneClick,allowElevation,perMachine,allowToChangeInstallationDirectory,createDesktopShortcut,createStartMenuShortcut,runAfterFinish,installerIcon,license,includeScript,multiLanguageInstaller,installerHeader,installerSidebar, etc.DmgSettings.kt—background,backgroundColor,badgeIcon,icon,format(6 DMG formats: UDRW, UDRO, UDCO, UDZO, UDBZ, ULFO),window,contents - install4j: Features — visual IDE with 80+ configurable actions
- Conveyor: Package formats — MSIX is a fixed format with no installer UI customization
- jpackage: Oracle man page —
--resource-dirfor template overrides
10. Store Distribution¶
Do stores actually require sandboxing?
- Mac App Store: App Sandbox is mandatory (Apple docs).
- Microsoft Store: Sandboxing is NOT required. MSIX desktop apps use
runFullTrust— a VFS overlay for clean uninstall, not a real sandbox (Microsoft docs). - Flathub: Sandbox nominally mandatory, but apps can request broad
filesystem=hostpermissions. - Snap Store: Strict confinement by default. Classic (unsandboxed) requires manual approval (Snapcraft docs).
| Tool | Mac App Store | Microsoft Store | Flathub | Snap Store | Score |
|---|---|---|---|---|---|
| Nucleus | ✅ (PKG + sandbox pipeline) | ✅ (AppX/MSIX) | ✅ (Flatpak) | ✅ (Snap) | 10 |
| Conveyor | ❌ | ✅ (MSIX) | ❌ | ❌ | 3 |
| install4j | ❌ | ❌ | ❌ | ❌ | 0 |
| jpackage | ⚠️ (--mac-app-store) |
❌ | ❌ | ❌ | 1 |
| Compose MP | ❌ | ❌ | ❌ | ❌ | 0 |
Sources
- Nucleus:
TargetFormat.kt—isStoreFormat= Pkg, AppX, Flatpak;PlatformSettings.kt—appStore,entitlementsFile,provisioningProfilefor MAS;AppXSettings.kt—identityName,publisher,capabilities;FlatpakSettings.kt—runtime,finishArgs,license - Conveyor: Windows config — Microsoft Store supported via
conveyor make ms-store-release; Output formats FAQ — Mac App Store listed as "not supported yet" - jpackage: Oracle man page —
--mac-app-storeflag exists but limited
For JVM apps, Nucleus is unique in handling the Mac App Store sandbox automatically: it extracts native libraries from JARs, strips duplicates, injects JVM arguments for redirected library loading, and signs extracted native libraries individually.
11. Runtime Libraries & Native UI¶
| Tool | Dark Mode | Decorated Windows | Single Instance | Deep Links | File Associations | Executable Type | Native SSL | Linux HiDPI | GraalVM Runtime | Score |
|---|---|---|---|---|---|---|---|---|---|---|
| Nucleus | ✅ (JNI, reactive) | ✅ (JBR + JNI backends) | ✅ (file lock) | ✅ (protocols) | ✅ (DSL) | ✅ (17 types) | ✅ (JNI, OS trust store) | ✅ (GDK_SCALE) | ✅ (bootstrap) | 10 |
| Conveyor | ❌ | ❌ | ❌ | ⚠️ (OS registration) | ⚠️ (OS registration) | ❌ | ❌ | ❌ | ❌ | 2 |
| install4j | ❌ | ❌ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | 3 |
| jpackage | ❌ | ❌ | ❌ | ❌ | ✅ (--file-associations) |
❌ | ❌ | ❌ | ❌ | 1 |
| Compose MP | ❌ | ❌ | ❌ | ❌ | ✅ (via jpackage) | ❌ | ❌ | ❌ | ❌ | 1 |
| All others | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 0 |
Sources
- Nucleus dark mode:
IsSystemInDarkMode.kt— JNI (not JNA) with native libraries per platform: macOS viaNSDistributedNotificationCenter, Windows via registryAppsUseLightTheme+RegNotifyChangeKeyValue, Linux via D-Busorg.freedesktop.portal.Settings. Real-time reactive Compose state. - Nucleus decorated windows: Split into three modules since v1.3.0 —
decorated-window-core(shared types/layout),decorated-window-jbr(JBR CustomTitleBar API on macOS/Windows),decorated-window-jni(JNI-based, works with any JVM including GraalVM Native Image). Custom undecorated window with GNOME (24px arcs) and KDE (10px) native controls on Linux. Material 3 variants indecorated-window-material. - Nucleus Linux HiDPI:
linux-hidpi— native GDK_SCALE detection for proper HiDPI scaling on Linux, required for native image builds. - Nucleus GraalVM runtime:
graalvm-runtime— centralizes native-image bootstrap (GraalVmInitializer.initialize()), font substitution, Skiko library extraction, and platform-specific reachability metadata. - Nucleus single instance:
SingleInstanceManager.kt—FileChannel.tryLock()+WatchServicefor inter-process communication - Nucleus deep links:
DeepLinkHandler.kt— macOS viaDesktop.setOpenURIHandler(Apple Events); Windows/Linux via CLI argument parsing - Nucleus executable type:
ExecutableRuntime.kt— 17ExecutableTypeenum values (EXE, MSI, NSIS, NSIS_WEB, PORTABLE, APPX, DMG, PKG, DEB, RPM, SNAP, FLATPAK, APPIMAGE, ZIP, TAR, SEVEN_Z, DEV) - Nucleus native-ssl:
NativeTrustManager.kt— JNI-basedX509TrustManagermerging OS certificates with JVM defaults: macOS via Security.framework (SecTrustCopyAnchorCertificates+SecTrustSettingsCopyCertificates), Windows via Crypt32 (ROOT/CAstores across 5 locations including Group Policy), Linux via PEM bundles (8 discovery paths). Companion modules:native-http-okhttp(OkHttp 4) andnative-http-ktor(Ktor engine). - Conveyor: OS integration —
app.url-schemesregisters URL handlers,app.file-associationsregisters file types at OS level (generates AppxManifest.xml, Info.plist, .desktop files). No runtime library — app code must handle open requests itself. - install4j: Features — single instance lock, file associations
- jpackage: Oracle man page —
--file-associationsflag with properties files
Nucleus is unique in the JVM space by bundling runtime libraries that address common desktop app needs. No other JVM packaging tool provides reactive dark mode detection, decorated windows, or deep link handling as a library. Since v1.3.0, the decorated window system offers two backends: JBR (for JetBrains Runtime) and JNI (for any JVM, including GraalVM Native Image), making it the only JVM window decoration solution that works across all JVM distributions. The linux-hidpi module and graalvm-runtime bootstrap module are also unique to Nucleus. File associations are more widely supported (jpackage, install4j, Conveyor all register at OS level), but only Nucleus combines registration with a runtime deep link handler.
The native-ssl module is unique in the JVM packaging space: it replaces the JSSE default trust manager at runtime with one that reads directly from the OS certificate store, so corporate-issued CAs, enterprise Group Policy certificates, and filtering proxy roots are trusted automatically — without any JVM cacerts manipulation. The companion native-http-okhttp and native-http-ktor modules provide ready-to-use HTTP clients pre-configured with this trust manager.
12. Documentation & Developer Experience¶
| Tool | Getting Started | DSL / Config Reference | CI/CD Guide | Migration Guide | API Docs | Examples | Score |
|---|---|---|---|---|---|---|---|
| Nucleus | ✅ | ✅ (comprehensive) | ✅ (detailed) | ✅ (from Compose MP) | ✅ | ✅ (demo app) | 9 |
| Conveyor | ✅ | ✅ (120+ settings) | ✅ | ✅ | ✅ | ✅ | 9 |
| install4j | ✅ | ✅ (extensive) | ✅ | ❌ | ✅ | ✅ | 9 |
| jpackage | ✅ (JEP + man page) | ❌ | ❌ | ❌ | ❌ | Minimal | 3 |
| Compose MP | ✅ | Partial | ❌ | ❌ | ❌ | ✅ | 5 |
Sources
- Nucleus: docs site — Getting Started, Configuration, per-platform guides, CI/CD, Runtime APIs, Migration, demo app in
example/ - Conveyor: docs site — tutorials, 120+ config keys, CI guide, comparisons page, multiple sample projects
- install4j: help center — extensive searchable docs
- jpackage: Oracle man page — CLI reference only
- Compose MP: Kotlin docs — basic packaging guide
13. Community, Maturity & Pricing¶
| Tool | Age | Community | Release Cadence | Price | Comm. Score | Price Score |
|---|---|---|---|---|---|---|
| Nucleus | 2025 | Small (growing) | Active | MIT (free) | 4 | 10 |
| Conveyor | ~2022 | Small-Medium | Active | Free (OSS) / $45/mo | 6 | 6 |
| install4j | ~2001 | Large (enterprise) | Active (Dec 2025) | $2,199+/dev | 10 | 3 |
| jpackage | JDK 14+ | N/A (JDK built-in) | JDK releases | Free | 9 | 10 |
| jDeploy | ~2020 | Small (growing) | Active (Feb 2026) | Apache 2 (free) | 5 | 10 |
| Compose MP | ~2021 | Large (JetBrains) | Active (Feb 2026) | Apache 2 (free) | 9 | 10 |
| JavaPackager | ~2019 | Small | Semi-maintained | GPL 3 (free) | 4 | 10 |
| Badass plugins | ~2018 | Medium | Active (Jan 2026) | Apache 2 (free) | 5 | 10 |
Sources
- Conveyor pricing: hydraulic.dev/pricing — Free for OSI-licensed projects (badge required); Standard $45/month (3 apps); Source tier on request
- install4j pricing: ej-technologies store — Multi-Platform $2,199 perpetual, Windows-only $769; floating license $6,599
- install4j version: Changelog — v12.0.2, December 19, 2025
- jDeploy: GitHub — v6.0.16, February 16, 2026; Apache-2.0
- Compose MP: Releases — v1.10.1, February 2026
- JavaPackager: Releases — v1.7.6, June 30, 2024; maintainer seeks contributors
- Badass-jlink: Releases — v3.2.1, January 29, 2026
- Launch4j: Changelog — v3.50, November 13, 2022
- Packr: Releases — v4.0.0, March 29, 2022 (dormant)
Scoring Matrix¶
Each dimension rated 0–10. Total = sum / 130 × 100 (rounded).
| Tool | Fmt | Upd | Sign | CI | Plat | Store | Opt | Inst | RT | Docs | Comm | Price | Build | Total |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Nucleus | 10 | 9 | 10 | 10 | 10 | 10 | 10 | 9 | 10 | 9 | 4 | 10 | 6 | 90 |
| install4j | 5 | 9 | 8 | 3 | 10 | 0 | 5 | 10 | 3 | 9 | 10 | 3 | 10 | 65¹ |
| Conveyor | 4 | 10 | 10 | 6 | 8 | 3 | 6 | 1 | 2 | 9 | 6 | 6 | 9 | 62² |
| jDeploy | 3 | 6 | 7 | 5 | 8 | 0 | 4 | 2 | 0 | 6 | 5 | 10 | 8 | 49 |
| Compose MP | 4 | 0 | 5 | 1 | 5 | 0 | 6 | 2 | 1 | 5 | 9 | 10 | 6 | 42 |
| jpackage | 4 | 0 | 3 | 0 | 8 | 1 | 4 | 3 | 1 | 3 | 9 | 10 | 4 | 38 |
| JavaPackager | 5 | 0 | 3 | 1 | 5 | 0 | 4 | 4 | 0 | 4 | 4 | 10 | 7 | 36 |
| Badass | 4 | 0 | 0 | 1 | 8 | 0 | 5 | 2 | 0 | 5 | 5 | 10 | 6 | 35 |
| Packr | 1 | 0 | 0 | 0 | 5 | 0 | 3 | 0 | 0 | 3 | 2 | 10 | 4 | 22 |
| Launch4j | 1 | 0 | 2 | 1 | 2 | 0 | 1 | 1 | 0 | 3 | 3 | 10 | 5 | 22 |
| JSmooth | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 10 | 1 | 11 |
Footnotes
¹ install4j's visual IDE, 20+ years of enterprise maturity, and cross-compilation (10/10) are significant advantages not fully captured by individual dimensions.
² Conveyor's cross-compilation (build all platforms from one machine, 10/10) is its biggest advantage. Its auto-update with delta updates (10/10) and broad signing provider support (10/10) are best-in-class.
Detailed Tool Profiles¶
jpackage (JDK 17+)¶
Built into the JDK since Java 14 (GA in 16). Creates platform-specific installers (DMG, PKG, MSI, EXE, DEB, RPM) from a modular or non-modular Java application. Requires the target OS for building (Oracle docs). macOS code signing and notarization via --mac-sign, --mac-signing-key-user-name, and --mac-app-store flags. Windows signing not included. Moderate customization via --resource-dir. WiX v4/v5 support added in JDK 24 (JDK 24 release notes). JDK 25 changed default jlink behavior: service bindings no longer included by default (JDK 25 release notes). No auto-update. The baseline that all JVM packaging tools build upon.
Conveyor (Hydraulic) — v21.1¶
A modern CLI tool that uniquely supports cross-compilation — build for Windows, macOS, and Linux all from a single machine (docs). Configured via HOCON (Human-Optimized Config Object Notation) with 120+ settings.
Formats: MSIX + custom EXE installer (~500 KB, drives Windows Deployment Engine APIs) + ZIP on Windows; signed+notarized .app bundles in per-architecture ZIPs on macOS; DEB + tar.gz on Linux (package formats). No DMG (deliberately avoided — FAQ), no PKG, no RPM (planned), no NSIS, no AppImage, no Snap, no Flatpak (planned).
Updates: Sparkle 2 on macOS with delta patches (configurable, default 5 versions), MSIX native 64 KB-chunk delta on Windows, apt repositories on Linux (update modes).
Signing: Self-signing for free distribution, purchased Authenticode/SSL certificates (.p12/.pfx), macOS notarization via App Store Connect API keys, plus 6 cloud signing providers: Azure Trusted Signing, Azure Key Vault, AWS KMS, SSL.com eSigner, DigiCert ONE, Google Cloud KMS, and HSM support (SafeNet, YubiKey) (keys and certificates).
OS integration: Registers URL schemes (app.url-schemes) and file associations (app.file-associations) at OS level, but does not provide a runtime library — apps must implement receiving logic themselves (OS integration).
JVM CA certificates: app.jvm.additional-ca-certs imports extra PEM/DER certificates into the bundled JDK's cacerts at package time — useful for corporate proxies and private root CAs (JVM config).
Build systems: Gradle plugin (Gradle 7+), Maven integration via CLI (mvn dependency:build-classpath), standalone CLI (Gradle/Maven docs).
Store distribution: Microsoft Store via conveyor make ms-store-release; Mac App Store not yet supported (Windows config).
Platforms: Windows x64+ARM64, macOS x64+ARM64 (separate per-architecture downloads, no universal/fat binary), Linux x64. Linux ARM64 has config infrastructure (app.linux.aarch64) but is listed as planned (Linux config, output formats FAQ).
Pricing: Free for OSI-licensed open source (badge required); $45/month Standard (3 apps); Source tier on request (pricing).
install4j (ej-technologies) — v12.0.2¶
The most mature commercial JVM installer tool (20+ years). Visual IDE for designing installer wizards with 80+ configurable actions (features). Full cross-compilation from any OS (homepage). Current version 12.0.2 released December 19, 2025 (changelog).
Formats: Native EXE installer (32-bit, 64-bit, ARM64), optional MSI wrapper, DMG archive, .app folder, shell-based GUI installer, RPM, DEB, gzipped tar.gz (media files docs). No PKG, NSIS, AppX/MSIX, AppImage, Snap, Flatpak.
v12 highlights: Reworked installation directory handling, widget styles for UI customization, macOS binary launchers (start JVM in-process) (what's new).
Pricing: Multi-Platform $2,199/dev perpetual (+ $879/yr support); Windows-only $769/dev; floating license $6,599 (store).
jDeploy — v6.0.16¶
Free, open-source tool (Apache-2.0) focused on simplicity (GitHub). Cross-compiles all platforms from one machine without any third-party tools other than OpenJDK (FAQ). v6.0.16 released February 16, 2026.
Formats: EXE on Windows, .app in tar.gz on macOS (DMG via separate jdeploy-action-dmg + macOS runner), DEB on Linux.
The installer is pre-signed and notarized by jDeploy itself, so developers don't need their own Apple certificate (FAQ). Auto-update is built-in via npm/GitHub Releases infrastructure (blog).
v6.0 features: Multi-modal deployments — GUI apps, CLI commands, background services, system tray helpers, and MCP servers for AI tool integration (homepage).
Compose Multiplatform (JetBrains) — v1.10.1¶
JetBrains' official Gradle plugin for Compose Desktop apps. v1.10.1 released February 2026 (releases). Wraps jpackage for packaging: supports DMG, PKG, MSI, EXE, DEB, RPM (native distributions). macOS code signing and notarization via DSL. ProGuard integration.
No auto-update, no cross-compilation, no NSIS/AppImage/Snap/Flatpak/AppX, minimal installer customization, no runtime libraries. Nucleus was designed as its successor/superset.
v1.10.0 highlights: Unified @Preview annotation, Navigation 3 on non-Android targets, stable Compose Hot Reload (JetBrains blog).
JavaPackager — v1.7.6¶
Gradle + Maven plugin supporting EXE (Inno Setup/WinRun4J), MSI (WiX), DMG, PKG, DEB, RPM, AppImage, and archives (GitHub). Windows code signing via Jsign 5.0 (added in v1.7.4, release notes). JRE bundling with module selection.
Last release: June 30, 2024. Maintainer actively seeking contributors (GitHub).
Badass-jlink / Badass-runtime Plugins¶
Popular Gradle plugins wrapping jlink and jpackage with ergonomic APIs. badass-jlink v3.2.1 (January 2026) for modular apps; badass-runtime v2.0.1 (November 2025) for non-modular apps (GitHub jlink, GitHub runtime). All jpackage formats supported. Inherits all jpackage limitations (no cross-compilation, no auto-update, no signing integration). Maintainer seeks co-maintainers (GitHub).
Launch4j — v3.50¶
Creates Windows EXE wrappers (~62 KB) for JAR files. Splash screen, JRE detection, heap configuration. Can be built cross-platform. Last release: November 13, 2022 (changelog). An omegat-org fork has more recent updates (2025) with ARM64 support. BSD license.
Packr (libGDX) — v4.0.0¶
Bundles JRE with application into a directory structure. Game-focused (libGDX/LWJGL). Does NOT produce installers — only raw app bundles/executables. Dormant: last release March 29, 2022 (GitHub releases). Apache 2.0 license.
Strengths & Weaknesses¶
Nucleus's Strengths¶
- Unmatched format coverage — 16 formats, more than any other JVM tool
- Only JVM tool with integrated runtime libraries — dark mode, decorated windows (JBR + JNI backends), single instance, deep links, executable type detection, Linux HiDPI scaling
- Best CI pipeline for JVM apps — 6 composite GitHub Actions, 6-runner matrix, universal macOS + MSIX bundle, GraalVM native image builds
- First JVM tool with AOT cache — Project Leyden (JDK 25+), no GraalVM required
- First JVM tool with integrated GraalVM Native Image support — compile Compose Desktop apps to standalone native binaries (~0.5s cold boot, ~100–150 MB RAM, no bundled JRE). Three startup tiers: standard JVM → AOT cache (Leyden) → native image
- Broadest store distribution — 4 stores (MAS, MS Store, Flathub, Snap Store), unique JVM sandbox pipeline
- Full signing matrix — macOS + notarization, Windows PFX + Azure Trusted Signing
- Free and open source (MIT)
- Native SSL runtime — unique JNI module using the OS trust store (macOS Security.framework, Windows Crypt32, Linux PEM bundles); pre-wired OkHttp and Ktor adapters; no cacerts manipulation needed at runtime
- Build-time CA cert patching — import custom PEM/DER certificates into the bundled JVM's
cacertsat packaging time (Conveyor also offers this viaapp.jvm.additional-ca-certs) - Decorated windows on any JVM — JNI backend (v1.3.0+) removes JBR dependency, enabling native window decorations with GraalVM, standard OpenJDK, and any other JVM distribution
Nucleus's Weaknesses¶
- No cross-compilation — requires per-OS CI runners (mitigated by CI actions)
- Gradle-only — no Maven or CLI support
- Young project — smaller community, less battle-testing
- Depends on electron-builder — Electron ecosystem dependency used as backend
- GraalVM Native Image is experimental — requires BellSoft Liberica NIK 25, limited to DMG/NSIS/DEB packaging, and some Compose features may need additional reachability metadata
When to Choose Something Else¶
| Use Case | Recommended Tool | Why | Source |
|---|---|---|---|
| Build from one machine | Conveyor or install4j | Full cross-compilation | Conveyor, install4j |
| Custom installer UI | install4j | Visual IDE, 80+ actions | Features |
| Simplest setup | jDeploy | Zero-config CLI, cross-compiles | jDeploy |
| Enterprise deployment | install4j | 20+ years maturity | ej-technologies |
| Maven-only project | install4j or JavaPackager | Nucleus is Gradle-only | — |
| Delta updates critical | Conveyor | MSIX + Sparkle delta | Updates |
| Maximum signing providers | Conveyor | 6 cloud HSM services | Keys |
Methodology¶
- Codebase analysis — Nucleus plugin source, runtime libraries, CI workflows, and composite actions analyzed by Claude Code with direct source file references
- Web research — AI agents visited official documentation pages for all 11 tools, collecting version numbers, feature lists, pricing, and platform support
- Source verification — Every claim includes a link to the official source (documentation page, GitHub repository, or vendor site)
- Scoring — Each tool rated 0–10 across 13 dimensions; total = raw sum / 130 × 100
Disclaimer
While every effort was made to verify accuracy with source links, tool capabilities evolve. Always check the linked documentation for the latest information. Conveyor data verified against v21.1 docs (February 2026). Nucleus data verified against v1.3.x source code (March 2026).