Saltar al contenido

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

  1. Sube el zip a ExeTup. Elegirá MyApp.exe como programa principal.
  2. Escribe el nombre, la misma versión que pasaste a --app-version y el nombre de tu editor.
  3. 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.
  4. Mantén 64 bits; jpackage compila para la arquitectura del JDK, que es x64 en casi cualquier máquina.
  5. 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 jlink ocurre automáticamente; --jlink-options --strip-debug y --jlink-options --no-man-pages recortan 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/ y runtime/ 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.exe antes de comprimir y el Setup.exe descargado 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