Proteger aplicaciones Spring Boot
springboot protege aplicaciones Spring Boot y se ocupa de BOOT-INF/classes, BOOT-INF/lib, el cargador de Spring Boot y el escaneo del framework.
1. Cómo hacerlo en la interfaz gráfica
-
En la página de tipo de aplicación, elija Spring Boot.

-
Seleccione la aplicación Spring Boot que quiere proteger, la versión de Java que se incluirá y las plataformas de destino, y elija entre modo simple o avanzado.

-
En el modo avanzado, elija el diseño de salida, los JAR de dependencia que quiere proteger, los ajustes de JavaFX, las opciones de la JVM y las reglas de exclusión. El modo simple deduce el diseño y las exclusiones del escaneo de compatibilidad. El significado de cada opción está en Ajustes del modo avanzado de Protector4J.

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

2. Ejemplos de línea de comandos
La forma más corta:
p4j springboot app.jar dist
Por defecto se usa el diseño p4jx-fat. Para elegir otro de forma explícita:
p4j springboot app.jar dist --layout fat
p4j springboot app.jar dist --layout separate
Proteger solo una parte de la aplicación:
p4j springboot app.jar dist \
--protect 'com.example.service.impl.**' \
--exclude 'com.example.dto.**,com.example.config.**'
3. Estructura de la salida y diseños
p4jx-fat: el diseño por defecto, un único archivo protegido
dist/
├── app.p4jx # con el sufijo jar pasa a ser app.jar
├── vlxjre/
├── run.sh
├── run.command
└── run.bat
Características:
- toda la aplicación se entrega como un único archivo P4JX;
- el archivo físico no es un ZIP de forma predeterminada;
- los recursos de Spring Boot, las dependencias anidadas y los metadatos se ofrecen mediante una vista JAR virtual;
- ofrece el alcance de protección más amplio, apropiado para aplicaciones que no dependen de escáneres de classpath de terceros.
fat: diseño de compatibilidad con Spring Boot
dist/
├── app.jar
├── app.p4jx # con el sufijo jar pasa a ser app-protected.jar
├── vlxjre/
└── run.*
Características:
app.jarconserva la estructura física estándar deBOOT-INF;- las implementaciones reales de las clases protegidas quedan en el archivo P4JX contiguo;
- conviene a las aplicaciones que necesitan escanear la estructura física del JAR de Spring Boot, por ejemplo con ClassGraph o Reflections;
- los dos archivos dependen entre sí y deben actualizarse y entregarse juntos.
separate: diseño de compatibilidad separado
dist/
├── plain-launcher.jar
├── app.p4jx
├── lib/
├── vlxjre/
└── run.*
Características:
- el cargador de Spring Boot, las clases sin proteger y las dependencias van por separado;
- conviene a entornos de integración antiguos que exigen un classpath plano
lib/*; - el iniciador generado precarga las clases protegidas;
- en proyectos nuevos es preferible
p4jx-fat, o el que recomiende el escáner entrep4jx-fatyfat.
Cómo elegir el diseño
| Situación | Diseño recomendado |
|---|---|
| Un servicio Spring Boot corriente | p4jx-fat |
| La aplicación usa realmente un escáner como ClassGraph o Reflections | fat |
| Hace falta un directorio plano de dependencias externas, o cifrarlas por separado | separate |
| No está seguro | Ejecute antes --compat-scan |
La capa ZIP solo ayuda a las herramientas que leen directamente el directorio central del ZIP. No sustituye a la estructura física de Spring Boot que necesitan el ClassLoader y los escáneres de classpath.
4. Arranque
./run.sh --spring.profiles.active=prod
En Windows:
run.bat --spring.profiles.active=prod
No sustituya el directorio vlxjre de la salida por un JRE del sistema.
Para destinos Windows puede generar además un iniciador nativo. Funciona con los tres diseños y convive con los scripts de arranque; consulte Crear un iniciador EXE de Windows.
Opciones de inicio de la JVM
Puede fijar las opciones al empaquetar, escribiendo una por línea en Opciones de inicio de la JVM dentro de la interfaz gráfica o indicándolas en la línea de comandos:
p4j springboot app.jar dist \
--jvm-option -Xms1g \
--jvm-option -Xmx2g
Para añadir opciones a un paquete ya desplegado solo durante una ejecución:
APP_JAVA_OPTS="-Duser.timezone=Europe/Madrid" ./run.sh
También puede editar directamente el script desplegado:
- macOS y Linux: en
run.sh, añadaJVM_OPTS+=("-Xms1g" "-Xmx2g")después de las líneas generadasJVM_OPTS=(...)yJVM_OPTS+=(...). - Windows: en
run.bat, añadaset "JVM_OPTS=%JVM_OPTS% -Xms1g -Xmx2g"después de la línea generadaset "JVM_OPTS=...".
No elimine las opciones que el empaquetador generó para Spring Boot o JavaFX, como --add-opens y la ruta de módulos. Volver a empaquetar sobrescribe cualquier cambio manual; los detalles están en Opciones de inicio de la JVM.
5. Alcance de la protección
De forma predeterminada se protegen las clases de aplicación bajo BOOT-INF/classes. Estas clases ligadas a Spring suelen quedar mejor sin proteger:
- clases
@Controller,@RestControllery@ControllerAdvice; - clases
@Configuration, clases de autoconfiguración y clases ampliadas con AOT o CGLIB; - DTO de Jackson, entidades JPA, records y modelos de validación;
- el punto de entrada de la aplicación y cualquier clase que el framework construya o envuelva en un proxy directamente;
- clases que necesitan ampliación de bytecode en tiempo de ejecución.
Proteja las implementaciones de los servicios y acceda a ellas por una fachada o interfaz pública. Las reglas admiten nombres de clase exactos, además de pkg.* y pkg.**.
6. Proteger JAR de dependencia
--protect-lib protege las dependencias coincidentes de BOOT-INF/lib y funciona con los tres diseños.
p4j springboot app.jar dist \
--protect-lib 'company-core-*.jar,pricing-*.jar'
Proteja únicamente sus propias dependencias de código cerrado. No cifre paquetes de frameworks de terceros como Spring, Tomcat, bibliotecas de registro o controladores de base de datos con la idea de «proteger más».
7. Escaneo de compatibilidad
p4j springboot app.jar --compat-scan
p4j springboot app.jar dist --compat-apply
Las dos opciones no pueden usarse juntas. Se diferencian así:
| Opción | Qué hace | Cuándo usarla |
|---|---|---|
--compat-scan | Analiza 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 Spring Boot u otras dependencias, tras cambiar el alcance o el diseño, y al investigar un problema de compatibilidad. |
--compat-apply | Analiza, 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 springboot, --compat-apply puede elegir el diseño, añadir reglas de exclusión y ajustar la capa ZIP, JavaFX y el sufijo del archivo. Para todo salvo las exclusiones, 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.