Proteger aplicaciones Java corrientes

javaapp se encarga de las aplicaciones Java corrientes que tienen una clase principal. Genera el archivo protegido, el VLX JRE de cada plataforma de destino y los scripts de arranque.

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

  1. En la página de tipo de aplicación, elija Aplicación Java.

    Elegir Aplicación Java

  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.

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

  3. En el modo avanzado, rellene la Clase principal si hace falta y configure las opciones de la JVM, los ajustes de JavaFX y las reglas de exclusión. El modo simple omite esta página. El significado de cada opción está en Ajustes del modo avanzado de Protector4J.

    Configurar las opciones avanzadas de una aplicación Java corriente

  4. Elija el directorio de salida, revise el resumen y haga clic en Ejecutar protección.

    Elegir el directorio de salida y ejecutar la protección

2. Ejemplos de línea de comandos

Cuando el manifiesto ya declara la Main-Class correcta:

p4j javaapp app.jar dist

Si el manifiesto no tiene Main-Class, o quiere arrancar desde otra clase, indíquela con --main:

p4j javaapp app.jar dist --main com.example.Main

Clase principal y opciones de la JVM a la vez:

p4j javaapp app.jar dist \
  --main com.example.Main \
  --jvm-option -Xms512m \
  --jvm-option -Xmx2g

Proteger solo una parte de la aplicación:

p4j javaapp app.jar dist \
  --protect 'com.example.core.**' \
  --exclude 'com.example.core.dto.**'

Escaneo de compatibilidad y aplicación automática de las recomendaciones:

p4j javaapp app.jar --compat-scan
p4j javaapp app.jar dist --compat-apply

Las dos opciones no pueden usarse juntas. Se diferencian así:

OpciónQué haceCuándo usarla
--compat-scanAnaliza el JAR de entrada, muestra los riesgos y las recomendaciones de configuración y termina. No codifica nada ni genera dist, así que no necesita directorio de salida.Lea primero el informe la primera vez que proteja la aplicación, tras actualizar dependencias o cambiar el alcance de la protección, y al investigar un problema de compatibilidad.
--compat-applyAnaliza, incorpora las recomendaciones conservadoras y continúa con la codificación y la salida, por lo que sí necesita directorio de salida.Úsela para terminar el empaquetado cuando ya haya leído el resultado del escaneo y acepte las recomendaciones. Sirve también para compilaciones repetidas y canalizaciones de CI con reglas ya verificadas.

Con javaapp, --compat-apply puede añadir reglas de exclusión a partir del escaneo y ajustar la capa ZIP, JavaFX y el sufijo del archivo. Para esos tres últimos, prevalece el valor que indique de forma explícita en la línea de comandos. Las exclusiones recomendadas se combinan por defecto con sus propios patrones --exclude; añada también --no-compat-excludes si no quiere que se agreguen. El escáner solo hace análisis heurístico estático, de modo que los problemas que exigen cambios en el código no los arregla --compat-apply, y la aplicación empaquetada sigue necesitando pruebas de regresión en la plataforma de destino.

Los demás comandos, todas las opciones, las variables de entorno y los ejemplos de automatización están en la Referencia de la línea de comandos.

3. Estructura de la salida

dist/
├── app.p4jx              # con --archive-suffix jar pasa a ser app.jar
├── vlxjre/               # entorno de ejecución acorde al archivo y la plataforma
├── lib/                  # dependencias del Class-Path del manifiesto, opcional
├── run.sh
├── run.command
├── run.bat
└── README.md

Los recursos que no son clases se guardan en la vista pública de recursos del archivo P4JX. Las clases protegidas solo muestran un esbozo de metadatos a los escáneres; los cuerpos reales de los métodos únicamente puede cargarlos el entorno de ejecución VLX.

4. Arranque

./run.sh [argumentos de la aplicación...]

En Windows:

run.bat [argumentos de la aplicación...]

No sustituya el directorio vlxjre de la salida por un JRE del sistema. Si tiene que arrancar la aplicación a mano, tome el script generado como plantilla y conserve su classpath, sus opciones de VM y sus opciones de módulo de JavaFX.

Para destinos Windows puede generar además un iniciador nativo que se ejecuta con un doble clic. Convive con los scripts de arranque; consulte Crear un iniciador EXE de Windows.

Opciones de inicio de la JVM

Al empaquetar, escriba una opción por línea en Opciones de inicio de la JVM dentro de la interfaz gráfica, o repita el modificador en la línea de comandos:

--jvm-option -Xms512m --jvm-option -Xmx2g

Para cambiarlas de forma permanente en un directorio ya desplegado:

  • macOS y Linux: edite run.sh y añada JVM_OPTS+=("-Xms512m" "-Xmx2g") antes de la comprobación de APP_JAVA_OPTS. run.command llama al mismo run.sh.
  • Windows: edite run.bat y añada set "JVM_OPTS=%JVM_OPTS% -Xms512m -Xmx2g" antes de la comprobación de APP_JAVA_OPTS.

Las opciones puntuales pueden inyectarse mediante APP_JAVA_OPTS. Los ejemplos completos y las advertencias están en Opciones de inicio de la JVM. Los cambios manuales en los scripts se sobrescriben al volver a empaquetar.

5. Alcance de protección recomendado

De forma predeterminada se protegen las clases propias de la aplicación. En proyectos de producción es preferible nombrar explícitamente sus paquetes de negocio:

--protect 'com.mycompany.product.**'

Clases que normalmente conviene excluir:

  • DTO y records que Jackson serializa o deserializa directamente;
  • clases a cuyos campos o métodos se accede por JNI;
  • clases que un ORM, un contenedor de inyección de dependencias o un framework de proxies necesita reescribir;
  • bibliotecas de terceros y frameworks de código abierto;
  • clases que un ClassLoader propio debe redefinir a partir de un array de bytes.

6. Los sufijos .p4jx y .jar

p4j javaapp app.jar dist --archive-suffix jar

Esta opción solo cambia el nombre del archivo; el contenido sigue siendo P4JX. Úsela únicamente cuando un componente de terceros tenga .jar fijado en una URL o en un nombre de archivo. No convierte el archivo en un ZIP o un JAR corriente.