Proteger aplicaciones JavaFX

JavaFX puede activarse tanto en aplicaciones Java corrientes como en aplicaciones de escritorio Spring Boot. El entorno de ejecución reducido de P4JX no incluye JavaFX de serie: hay que activarlo de forma explícita o dejar que lo haga el escaneo de compatibilidad.

1. Cómo hacerlo en la interfaz gráfica

  1. Para una aplicación JavaFX sencilla, elija Aplicación Java en la página de tipo de aplicación. Para una aplicación de escritorio JavaFX construida sobre un contenedor de Spring, elija Spring Boot. El cifrado de bibliotecas solo produce un archivo protegido y no sustituye al empaquetado de una aplicación JavaFX real.

    Elegir Aplicación Java o Spring Boot

  2. Seleccione el JAR de entrada, la versión de Java que se incluirá y las plataformas de destino, y elija entre modo simple o avanzado. Los componentes de JavaFX se obtienen por separado para cada versión de Java y plataforma, de modo que una tarea con varias plataformas produce un paquete de salida independiente para cada una.

    Elegir la entrada, la versión de Java, la plataforma de destino y el modo

  3. En el modo simple, si el escaneo de compatibilidad encuentra referencias a javafx.* o dependencias de JavaFX, lo activa automáticamente y explica el motivo en el resultado. Si además encuentra javafx.scene.web, incluye también WebView. El escaneo es un análisis heurístico estático, así que revise de nuevo el resumen de JavaFX en la página de salida.

  4. En el modo avanzado, marque Incluir JavaFX en el runtime empaquetado en la pestaña Entorno de ejecución JavaFX y elija la estrategia para WebView:

    • Automático (detectar javafx.scene.web): decide según si la aplicación hace referencia a javafx.scene.web.
    • Incluir: incorpora siempre WebView (fx-webkit).
    • Excluir: no lo incorpora nunca.

    En una aplicación Java corriente, la pestaña se ve así:

    Pestaña del entorno de ejecución JavaFX en las opciones avanzadas de una aplicación Java corriente

    Las aplicaciones de escritorio Spring Boot usan una pestaña con el mismo nombre:

    Pestaña del entorno de ejecución JavaFX en las opciones avanzadas de Spring Boot

  5. Tras elegir el directorio de salida, compruebe que el resumen indica JavaFX como incluido y que el estado de WebView es el esperado, y haga clic en Ejecutar protección. Una vez generado el paquete, use su script de arranque para verificar en cada plataforma de destino la ventana, el FXML, los recursos CSS e imágenes y WebView.

Los componentes de WebView ocupan unos 40 MB. Elija Excluir para reducir el tamaño del paquete si no los necesita. Los demás ajustes de las páginas avanzadas se explican en Ajustes del modo avanzado de Protector4J.

2. Obtener los componentes desde la línea de comandos

p4j javaapp fx-app.jar dist --javafx

Para Spring Boot con JavaFX:

p4j springboot fx-boot.jar dist --javafx

Para forzar la inclusión o la exclusión de WebView:

--javafx-webview
--no-javafx-webview

La herramienta descarga los componentes correspondientes desde el sitio público de descargas de su región, según la línea del JDK y la plataforma de destino. Ni la descarga de JavaFX ni la del VLX JRE requieren entregar al cliente una clave de almacenamiento en la nube.

3. Componentes sin conexión

La línea de comandos admite un directorio local:

p4j javaapp fx-app.jar dist --javafx /opt/p4jx-fx

El directorio puede tener una de estas dos formas:

  • fx-core.tar.gz y, opcionalmente, fx-webkit.tar.gz;
  • un árbol de archivos de JavaFX ya extraído, con lib/ como raíz.

La interfaz gráfica no permite elegir un directorio local de JavaFX, así que use la línea de comandos cuando trabaje sin conexión.

4. FXML

Si la aplicación usa FXMLLoader, el escaneo de compatibilidad recomienda activar la capa ZIP para escáneres:

p4j javaapp fx-app.jar dist --javafx --zip-overlay scanner

Los recursos FXML, las firmas de los controladores y el escaneo del framework hay que comprobarlos arrancando realmente la aplicación en la plataforma de destino.

5. Java 8 frente a Java 11 y posteriores

  • Java 8 usa jfxrt.jar y el modelo de directorios de extensión, así que los scripts generados no suelen necesitar opciones de módulo.
  • Java 11 y posteriores usan JAR modulares de JavaFX, y los scripts generados establecen una ruta de módulos propia junto con --add-modules.

Arranque siempre con el run.sh, run.command o run.bat generados. No apunte usted mismo la ruta de módulos a todo vlxjre/lib.

6. Cómo decide la detección automática

La detección examina las referencias de clase de su propio código y los nombres de archivo de los JAR de dependencia. A propósito no analiza el bytecode de todas las dependencias de terceros: eso haría que integraciones opcionales de JavaFX se dieran por usadas realmente.

Si JavaFX está embebido mediante shade en una dependencia cuyo nombre no lo delata, la detección automática puede pasarlo por alto. En ese caso, indique --javafx de forma explícita.

7. Alcance de protección recomendado

  • Si conviene proteger las subclases de Application de JavaFX, los controladores FXML y los modelos de propiedades depende de cómo se comporten en las pruebas con su versión de Java de destino.
  • Las clases puente a las que se accede directamente por JNI o desde código nativo deben quedar sin proteger.
  • Empiece con el modo simple o con --compat-scan y haga después pruebas de regresión sobre la creación de ventanas, la carga de FXML, los recursos CSS e imágenes, WebView y las bibliotecas nativas de la plataforma.