Despliegue¶
Por qué el jar es "delgado" y no "fat"¶
El jar que se genera para esta app no tiene todas sus dependencias fusionadas adentro — es un jar delgado (solo las clases del proyecto) más un META-INF/MANIFEST.MF que le dice a Java, vía Class-Path, cuáles otros jars cargar desde una carpeta lib/ al lado.
Esto es deliberado: JavaFX usa ServiceLoader internamente para su toolkit gráfico, y si se fusionan varios jars en uno solo (un jar "fat"), los archivos de META-INF/services de los distintos módulos de JavaFX se pisan entre sí en vez de fusionarse — la app deja de arrancar sin ningún error visible. Manteniendo cada jar intacto y aparte se evita ese problema por completo.
Consecuencia práctica: cada vez que se agrega o quita una dependencia en pom.xml, hay que actualizar a mano el Class-Path del MANIFEST.MF y la carpeta lib/ del instalador — no es automático. Si se olvida, el síntoma típico no es un error de arranque, sino que algo deja de funcionar en silencio (un jar que Java nunca llegó a cargar porque no estaba listado).
Cómo se empaqueta, de punta a punta¶
- Jar del proyecto:
mvn packagegenera el jar delgado del proyecto. - Dependencias: se copian todos los jars de dependencias (sin fusionar) a una carpeta
lib/junto al jar del proyecto. .exe: launch4j envuelve el jar en un ejecutable de Windows, con su propio ícono embebido, apuntando a un JRE 17 incluido.- Instalador: Inno Setup empaqueta el
.exe, la carpetalib/, y el JRE completo en un instalador único (.exede instalación), con su propio ícono y banner.
JRE compartido con el servicio de documentos¶
Ambos componentes (esta app y el servicio de documentos) usan el mismo JRE 17 instalado una sola vez en el servidor — es una decisión explícita para ahorrar disco (el JRE completo pesa varios cientos de MB, no tiene sentido duplicarlo). Esto trae un trade-off que hay que tener presente al reinstalar: si el servicio de documentos está corriendo como servicio de Windows (vía NSSM) mientras se reinstala esta app, Windows puede bloquear archivos del JRE compartido (por ejemplo, extnet.dll) y la instalación falla con un error de "acceso denegado". La solución es simple pero hay que recordarla: detener el servicio de documentos antes de reinstalar esta app, y volver a iniciarlo después.
Migraciones al instalar una versión nueva¶
Instalar una versión nueva encima de una instalación existente no requiere tocar la base de datos de producción a mano — las migraciones corren automáticamente al arrancar (ver Modelo de datos). El instalador también se encarga de:
- Propagar la variable de entorno de la ruta de la base de datos al proceso actual (para que el primer arranque post-instalación ya la vea, sin necesitar cerrar sesión ni reiniciar Windows).
- Migrar automáticamente una base de datos de una ubicación antigua a la ubicación actual, si detecta que existe la primera y no la segunda.
Cómo corre en producción¶
| Pieza | Detalle |
|---|---|
| Esta app | Instalada como aplicación de escritorio normal (no como servicio de Windows), pero configurada para vivir en la bandeja del sistema y arrancar con el usuario — corre siempre, sin intervención |
| Servicio de documentos | Corre como servicio de Windows real, vía NSSM (Non-Sucking Service Manager) |
| HTTPS | Un reverse proxy único (Caddy) al frente de todos los servicios del servidor, con renovación automática de certificado — el servicio de documentos escucha solo en localhost |
| Base de datos compartida | Ubicación fijada por una variable de entorno de sistema, no hardcodeada en ninguno de los dos componentes |