Instalador de Windows para una app Java, de jpackage a Setup.exe
Usa jpackage para empaquetar tu JAR con un runtime de Java en una carpeta con un .exe nativo y convierte esa carpeta en un instalador de Windows, sin el toolset de WiX.
Actualizado el 31 de octubre de 2026 · 3 min de lectura
«Primero instala Java» no es algo que quieras decirles a tus clientes. Desde el JDK 14, jpackage resuelve la mitad del problema: empaqueta tu aplicación con un runtime de Java recortado y le da un MyApp.exe nativo. La otra mitad, el instalador de Windows, es donde jpackage te pide instalar el toolset de WiX y aprender sus particularidades. Esta guía toma la carpeta que produce jpackage y la convierte en un Setup.exe sin nada de eso.
Paso 1: generar la imagen de la aplicación
Coloca el JAR ejecutable y los JAR de sus dependencias en una misma carpeta (lib/ en el ejemplo) y ejecuta jpackage en Windows:
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
Esto crea MyApp/, que contiene:
MyApp.exe, un lanzador nativo con tu icono;app/, tus JAR y un archivo de configuración;runtime/, un runtime de Java con solo los módulos que la app necesita.
Para una app JavaFX, añade --module-path apuntando a la carpeta lib del SDK de JavaFX y --add-modules javafx.controls,javafx.fxml (ajústalo a los módulos que uses). Para una app modular, usa --module en lugar de --main-jar.
Abre MyApp\MyApp.exe para confirmar que la app arranca sin un Java instalado en el sistema. La carpeta runtime/ es lo que lo hace posible.
jpackage debe ejecutarse en Windows para producir una imagen de Windows. Sirve una máquina Windows, una máquina virtual o un runner de Windows en CI; consulta crear el instalador desde un Mac para ver las opciones.
Paso 2: comprimir la imagen en un zip
Comprime el contenido de MyApp/: MyApp.exe, app/ y runtime/. Mantén la estructura; el lanzador espera encontrar app/ y runtime/ a su lado.
Paso 3: generar el instalador
- Sube el zip a ExeTup. Elegirá
MyApp.execomo programa principal. - Escribe el nombre, la misma versión que pasaste a
--app-versiony el nombre de tu editor. - Elige todos los usuarios (Program Files, aviso de administrador) o usuario actual (sin aviso). Las apps Java de empresa distribuidas a empleados suelen instalarse por usuario; las apps de consumo, normalmente por equipo.
- Mantén 64 bits; jpackage compila para la arquitectura del JDK, que es x64 en casi cualquier máquina.
- Sube
app.ico, activa los accesos directos y genera el instalador.
El resultado es un instalador de Windows que coloca la imagen de la aplicación en su sitio, con una entrada en el menú Inicio y un desinstalador. Los clientes nunca ven Java.
¿Por qué no dejar que jpackage cree el instalador?
jpackage --type exe o --type msi sí produce un instalador, y para algunos equipos es suficiente. Necesita WiX Toolset 3 instalado y en el PATH, ofrece un asistente fijo con opciones limitadas, y el comportamiento de su desinstalador y de sus accesos directos tiene asperezas difíciles de cambiar sin meterse a fondo en WiX. Usar la app-image y un instalador aparte mantiene separadas las dos responsabilidades: jpackage hace el empaquetado del runtime, que es lo que hace bien, y el instalador se encarga de la integración con Windows.
Notas específicas de Java
- Tamaño del runtime. Un runtime recortado ocupa entre 40 y 80 MB. El recorte de módulos al estilo de
jlinkocurre automáticamente;--jlink-options --strip-debugy--jlink-options --no-man-pagesrecortan un poco más. - Opciones de Java. Pasa los flags de la JVM con
--java-options "-Xmx1g"al generar la imagen; quedan integrados en la configuración del lanzador. - Actualizaciones. Distribuye un instalador nuevo con una versión superior. Instalar sobre la versión anterior reemplaza
app/yruntime/en el mismo lugar. - Launch4j y similares envuelven un JAR en un
.exe, pero no incluyen un runtime de forma predeterminada, así que no eliminan el paso de «instalar Java». jpackage sí lo hace. - Firma. Firma
MyApp.exeantes de comprimir y elSetup.exedescargado después; consulta la guía sobre SmartScreen.
Preguntas frecuentes
¿Los clientes necesitan tener Java instalado?
No. La carpeta runtime/ que crea jpackage contiene todo lo que la app necesita, y el instalador la distribuye junto con la app.
¿Puedo instalar la app sin el toolset de WiX?
Sí. WiX solo es necesario para los tipos exe y msi propios de jpackage. Genera una app-image en su lugar y usa ExeTup para el instalador.
¿Funciona con JavaFX?
Sí. Incluye los módulos de JavaFX al generar la imagen, prueba MyApp.exe y después empaqueta la carpeta como se explica arriba.
¿Puedo incluir un JDK distinto, como Temurin?
jpackage usa para el runtime el JDK desde el que se ejecuta. Ejecútalo desde el JDK que quieras distribuir, o pasa --runtime-image con un runtime que hayas creado con jlink.
Guías relacionadas
- Cómo crear un Setup.exe para tu app de Windows (sin código)Qué hace realmente un Setup.exe, las tres formas de crear uno y cómo convertir la carpeta de tu app en un instalador profesional en minutos, sin escribir ningún script.
- Convertir un .exe en un instalador de Windows (exe a Setup.exe)Cómo convertir un .exe simple, o una carpeta que contiene un .exe, en un instalador de Windows real con accesos directos y desinstalador, sin escribir un script de instalación.
- Crear un instalador de Windows para una app .NET (WPF, WinForms, consola)Publica una app de escritorio .NET con dotnet publish, elige entre dependiente del framework y autocontenida, y empaqueta la carpeta de publicación en un Setup.exe con accesos directos y desinstalador.