Zum Inhalt springen

Windows-Installer für eine Java-App, von jpackage bis Setup.exe

Bündeln Sie Ihr JAR mit jpackage samt Java-Runtime in einen Ordner mit nativer .exe und verpacken Sie diesen Ordner in einen Windows-Installer, ganz ohne WiX-Toolset.

Aktualisiert am 31. Oktober 2026 · 3 Min. Lesezeit

„Installieren Sie zuerst Java“ ist nichts, was man seinen Kunden sagen möchte. Seit JDK 14 löst jpackage die Hälfte des Problems: Es bündelt Ihre Anwendung mit einer verschlankten Java-Runtime und gibt ihr eine native MyApp.exe. Bei der anderen Hälfte, dem Windows-Installer, verlangt jpackage, dass Sie das WiX-Toolset installieren und seine Eigenheiten lernen. Diese Anleitung nimmt den von jpackage erzeugten Ordner und macht daraus eine Setup.exe, ohne irgendetwas davon.

Schritt 1: Das Anwendungsabbild bauen

Legen Sie das ausführbare JAR und seine Abhängigkeits-JARs in einen Ordner (unten lib/) und führen Sie jpackage unter Windows aus:

jpackage --type app-image --name MyApp --input lib --main-jar myapp.jar --main-class com.example.Main --icon app.ico --app-version 2.4.0

Das erzeugt MyApp/ mit folgendem Inhalt:

  • MyApp.exe, ein nativer Launcher mit Ihrem Symbol;
  • app/, Ihre JARs und eine Konfigurationsdatei;
  • runtime/, eine Java-Runtime mit nur den Modulen, die die App braucht.

Für eine JavaFX-App ergänzen Sie --module-path mit dem Pfad zum lib-Ordner des JavaFX SDK sowie --add-modules javafx.controls,javafx.fxml (an die von Ihnen verwendeten Module anpassen). Für eine modulare App verwenden Sie --module statt --main-jar.

Starten Sie MyApp\MyApp.exe, um zu prüfen, dass die App ohne systemweit installiertes Java läuft. Der Ordner runtime/ macht das möglich.

jpackage muss unter Windows laufen, um ein Windows-Abbild zu erzeugen. Ein Windows-Rechner, eine virtuelle Maschine oder ein Windows-Runner in der CI funktionieren alle; Optionen finden Sie unter Bauen auf einem Mac.

Schritt 2: Das Abbild zippen

Zippen Sie den Inhalt von MyApp/: MyApp.exe, app/ und runtime/. Behalten Sie die Struktur bei; der Launcher erwartet app/ und runtime/ neben sich.

Schritt 3: Den Installer bauen

  1. Laden Sie die Zip-Datei bei ExeTup hoch. Es wählt MyApp.exe als Hauptprogramm aus.
  2. Geben Sie den Namen, dieselbe Version wie bei --app-version und Ihren Herausgebernamen ein.
  3. Wählen Sie alle Benutzer (Program Files, Admin-Abfrage) oder aktueller Benutzer (keine Abfrage). Java-Geschäftsanwendungen für Mitarbeiter werden oft pro Benutzer installiert, Endkunden-Apps meist pro Rechner.
  4. Behalten Sie 64-Bit bei; jpackage baut für die Architektur des JDK, und das ist auf fast jedem Rechner x64.
  5. Laden Sie app.ico hoch, aktivieren Sie die Verknüpfungen und starten Sie den Build.

Das Ergebnis ist ein Windows-Installer, der das Anwendungsabbild samt Startmenü-Eintrag und Deinstallationsprogramm an seinen Platz bringt. Kunden bekommen Java nie zu sehen.

Warum nicht jpackage den Installer bauen lassen?

jpackage --type exe oder --type msi erzeugt tatsächlich einen Installer, und für manche Teams reicht das. Es braucht ein installiertes WiX Toolset 3 im PATH, bietet einen festen Assistenten mit begrenzten Optionen, und das Verhalten von Deinstallationsprogramm und Verknüpfungen hat Ecken und Kanten, die sich ohne tiefes Eintauchen in WiX kaum ändern lassen. Mit dem app-image und einem separaten Installer bleiben die beiden Aufgaben getrennt: jpackage übernimmt das Bündeln der Runtime, worin es gut ist, und der Installer die Windows-Integration.

Hinweise speziell zu Java

  • Größe der Runtime. Eine verschlankte Runtime hat 40 bis 80 MB. Das Beschneiden der Module nach jlink-Art geschieht automatisch; --jlink-options --strip-debug und --jlink-options --no-man-pages sparen noch etwas mehr.
  • Java-Optionen. Übergeben Sie JVM-Flags beim Bauen des Abbilds mit --java-options "-Xmx1g"; sie werden fest in die Konfiguration des Launchers geschrieben.
  • Updates. Liefern Sie einen neuen Installer mit höherer Version aus. Die Installation über die vorherige Version ersetzt app/ und runtime/ an Ort und Stelle.
  • Launch4j und ähnliche Tools verpacken ein JAR in eine .exe, bündeln aber standardmäßig keine Runtime und ersparen damit den Schritt „Java installieren“ nicht. jpackage schon.
  • Signieren. Signieren Sie MyApp.exe vor dem Zippen und die heruntergeladene Setup.exe danach; siehe die SmartScreen-Anleitung.

Häufige Fragen

Müssen Kunden Java installiert haben?

Nein. Der von jpackage erzeugte Ordner runtime/ enthält alles, was die App braucht, und der Installer liefert ihn zusammen mit der App aus.

Kann ich die App ohne das WiX-Toolset installieren?

Ja. WiX wird nur für die jpackage-eigenen Typen exe und msi gebraucht. Bauen Sie stattdessen ein app-image und nutzen Sie ExeTup für den Installer.

Funktioniert das mit JavaFX?

Ja. Nehmen Sie beim Bauen des Abbilds die JavaFX-Module auf, testen Sie MyApp.exe und verpacken Sie den Ordner dann wie oben beschrieben.

Kann ich ein anderes JDK bündeln, etwa Temurin?

jpackage verwendet für die Runtime das JDK, aus dem es gestartet wird. Starten Sie es aus dem JDK, das Sie ausliefern möchten, oder übergeben Sie mit --runtime-image eine Runtime, die Sie mit jlink gebaut haben.

Verwandte Anleitungen