Cómo implementar una aplicación de escritorio JavaFX 11 con un JRE
javafx-11 openjfx (3)
Tengo una aplicación empresarial de escritorio JavaFX (JDK 8), que utiliza Java Web Start para la implementación. Los usuarios tienen Java 8 instalado, y simplemente van a la URL (una URL pública en mi servidor AWS Linux) y la aplicación se descarga / inicia (usando Web Start). También puedo actualizar fácilmente la aplicación al implementar nuevos archivos JAR en el servidor. Todo funciona bien
Sin embargo, Oracle ha descontinuado Web Start con Java 11, y en su documento técnico "Actualización de Java Client Roadmap", marzo de 2018, recomiendan agrupar un JRE con la aplicación ("La noción de una aplicación que se distribuye por separado de un JRE independiente es, por lo tanto, se desvanece rápidamente ". No puedo confiar en que mis usuarios permanezcan en Java 8 para Web Start, e incluso si permanecen en 8, Oracle requiere una licencia para continuar usando Java 8 (que no tengo, puede ser muy costoso y prefiero De todos modos para moverse con la comunidad hacia JavaFX 11 y OpenJDK).
Me gustaría migrar a JavaFX 11. He seguido los "Primeros pasos con JavaFX11" de OpenJFX ( https://openjfx.io/openjfx-docs/ ), utilizando OpenJDK 11.0.1 con JavaFX SDK 11.0.1 de Gluon (en Netbeans 10vc2 ), y he podido ejecutar las aplicaciones de muestra (y me parece que debería poder portar mi código JavaFX 8 a JavaFX 11, muy fácilmente).
Sin embargo, aquí es donde estoy atascado para la dirección. ¿Cómo puedo empaquetar esto con el JRE e implementarlo en mis usuarios finales (y proporcionar actualizaciones de la aplicación)? ¿Hay un camino fácil para salir (o incluso un camino difícil, con algunas direcciones / guías)?
Puedo pasar cientos de horas escribiendo aplicaciones empresariales de escritorio expresivas, ricas y útiles en JavaFX 11, pero ¿qué hago entonces?
¿Los kits de herramientas de implementación, como JWrapper, InstallAnywhere, etc., son adecuados para esta nueva era de Java 11? ¿Gluon / openjfx.io quizás tenga alguna recomendación o guía que no pude ver? Parece que no puedo encontrar recomendaciones o guías de fuentes confiables, en la forma en que los desarrolladores, que se centran en escribir el código de front-end, implementamos las aplicaciones.
Gracias por cualquier ayuda u orientación.
Intente instalar4j. Puede ser tu salvador.
Revisa este artículo para ver el sufrimiento de otro desarrollador:
https://voyagergames.com/distributing-a-desktop-java-application/
José: Veo que tenemos el mismo problema que resolver (vea mi pregunta en Auto-Contained Application Packaging para una aplicación JavaFX en Windows: InnoSetup OR javafxpackager? ). Quizás, usar el javapackager de un JDK sería una solución "fácil", a pesar de los numerosos parámetros. En mi caso, ¿he logrado generar un "Paquete de Aplicación Autocontenido para una aplicación JavaFX en Windows" con esta herramienta?
La forma en que funciona ahora es que usted convierte su programa en un módulo, luego lo "vincula" a todos los demás módulos que requiere.
El resultado de este proceso de vinculación es lo que se conoce como una imagen.
Una imagen es en realidad un árbol de archivos, que incluye un directorio
bin
con uno o más ejecutables listos para ejecutar.
Este árbol es lo que distribuyes, normalmente como zip o tar.gz.
Los pasos son:
- Crear un módulo-info.java
- Compilar con una ruta de módulo en lugar de una ruta de clase
- Crea un tarro de clases, como de costumbre.
-
Convierta jar a jmod con la herramienta
jmod
de JDK - Enlace ese jmod y los módulos de los que depende, en una imagen
Escribir un descriptor de módulo
El primer paso es convertir la aplicación en un módulo.
Como mínimo, esto requiere crear un
module-info.java
en la parte superior del árbol de origen (es decir, en el paquete vacío).
Cada módulo tiene un nombre, que a menudo es el mismo que el nombre de un paquete pero no tiene que serlo.
Entonces, tu module-info.java puede verse así:
module com.mcs75.businessapp {
exports com.mcs75.desktop.businessapp;
requires java.logging;
requires transitive javafx.graphics;
requires transitive javafx.controls;
}
edificio
Cuando construyes, no especificas un classpath en absoluto. En su lugar, especifica una ruta de módulo.
Una ruta de módulo es una lista de directorios, no archivos.
Cada directorio contiene, como es lógico, módulos.
El directorio
jmods
del JDK está incluido implícitamente.
Todo lo que necesita incluir es directorios que contengan los módulos que no sean JDK que necesita.
En su caso, al menos eso significa JavaFX de Gluon:
javac -Xlint -g -d build/classes --module-path /opt/gluon-javafx/lib /
src/java/com/mcs75/desktop/businessapp/*.java
Luego creas un tarro de la forma habitual:
jar -c -f build/mybusinessapp.jar -C build/classes .
Un archivo jar con un módulo-info.class en él se considera un jar modular.
Haciendo un jmod
Crear un jmod suele ser un proceso simple:
mkdir build/modules
jmod create --class-path build/mybusinessapp.jar /
--main-class com.mcs75.desktop.businessapp.BuinessApplication /
build/modules/mybusinessapp.jmod
Enlace
Finalmente, utiliza el comando
jlink
del JDK para ensamblar todo:
jlink --output build/image /
--module-path build/modules:/opt/gluon-javafx/lib /
--add-modules com.mcs75.businessapp /
--launcher MyBusinessApp=com.mcs75.businessapp
jlink
crea un JRE mínimo, que contiene solo los módulos que agregas explícitamente (y los módulos que esos módulos explícitos requieren).
--add-modules
es la opción requerida que especifica qué agregar.
Al igual que con otras herramientas JDK,
--module-path
especifica directorios que contienen módulos.
La opción
--launcher
hace que el árbol de imágenes final tenga un script ejecutable adicional en su directorio
bin
con el nombre dado (la parte antes de los iguales).
Entonces,
MyBusinessApp=com.mcs75.businessapp
significa "crear un ejecutable llamado MyBusinessApp, que ejecuta el módulo com.mcs75.businessapp".
Debido a que el comando
jmod create
incluye una opción
--main-class
, Java sabrá qué ejecutar, al igual que declarar un atributo Main-Class en un manifiesto.
También es posible declarar explícitamente una clase para que se ejecute en la opción
--launcher
si se desea.
Distribuido
Lo que querrá distribuir es un zip o tar.gz de todo el árbol de archivos de imagen.
El ejecutable que el usuario debe ejecutar está en el directorio
bin
la imagen.
Por supuesto, eres libre de agregar tus propios ejecutables.
También es libre de colocar esto en cualquier tipo de instalador, siempre y cuando se conserve la estructura del árbol de imágenes.
Un futuro JDK tendrá una herramienta de empaquetado para crear instaladores nativos completos.
Construcción cruzada
Dado que la imagen incluye binarios nativos, deberá crear una imagen para cada plataforma. Obviamente, una opción es construir la imagen en un sistema Linux, y nuevamente en un sistema Windows, y nuevamente en una Mac, etc.
Pero también puedes usar
jmod
y
jlink
para crear imágenes para otras plataformas, independientemente de donde estés construyendo.
Sólo se necesitan unos pocos pasos adicionales. Primero, necesitarás los JDK para esas otras plataformas. Descárguelos como archivos comprimidos (zip o tar.gz), no como instaladores, y descomprímalos en los directorios de su elección.
Cada JDK define una cadena de
plataforma
.
Esto es normalmente de la forma <os> - <arch>.
La plataforma es una propiedad del módulo
java.base
;
Puedes ver la plataforma de cualquier JDK examinando ese módulo:
jmod describe path-to-foreign-jdk/jmods/java.base.jmod | grep ''^platform''
Pase la cadena de la plataforma a su comando jmod usando la opción
--target-platform
:
mkdir build/modules
jmod create --target-platform windows-amd64 /
--class-path build/mybusinessapp.jar /
--main-class com.mcs75.desktop.businessapp.BuinessApplication /
build/modules/mybusinessapp.jmod
Finalmente, al vincular, desea incluir explícitamente el directorio
jmods
del otro JDK, por lo que jlink no incluirá implícitamente sus propios módulos de JDK:
jlink --output build/image /
--module-path path-to-foreign-jdk/jmods:build/modules:/opt/gluon-javafx/lib /
--add-modules com.mcs75.businessapp /
--launcher MyBusinessApp=com.mcs75.businessapp