Proteger aplicaciones web de Tomcat
tomcat convierte un WAR en una base de Tomcat autónoma. Usa los componentes de Tomcat integrados en el empaquetador y no toca en ningún momento la instalación de Tomcat de su equipo.
1. Cómo hacerlo en la interfaz gráfica
-
En la página de tipo de aplicación, elija Tomcat WAR.

-
Seleccione el WAR de entrada, 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 Tomcat 9 o 10.1 o deje la detección automática, y ajuste si hace falta la ruta de contexto, las opciones de la JVM y las reglas de exclusión. El modo simple determina la versión de Tomcat a partir 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
Indicar la ruta de contexto:
p4j tomcat app.war dist --context /app
Escaneo de compatibilidad y aplicación automática de las recomendaciones:
p4j tomcat app.war --compat-scan
p4j tomcat app.war dist --compat-apply --context /app
Las dos opciones no pueden usarse juntas. Se diferencian así:
| Opción | Qué hace | Cuándo usarla |
|---|---|---|
--compat-scan | Analiza el WAR 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 ligadas a Tomcat, tras cambiar el alcance o los ajustes de JSP, 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 tomcat, --compat-apply puede añadir reglas de exclusión a partir del escaneo y ajustar la versión de Tomcat, la capa ZIP 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.
--tomcat-version vale auto de forma predeterminada. Póngalo en 9 o 10.1 cuando quiera fijarlo:
p4j tomcat app.war dist --context /app --tomcat-version 10.1
3. Estructura de la salida
dist/
├── bin/
│ ├── catalina.sh
│ ├── startup.sh
│ ├── shutdown.sh
│ └── *.bat
├── conf/p4jx/
│ ├── contexts.list
│ ├── protected-classes.list
│ └── allowed-prefixes.list
├── protected/
│ └── app.p4jx
├── lib/
│ ├── p4jx-tomcat-runtime.jar
│ └── tomcat-runtime-deps.jar
├── vlxjre/
├── run.sh
└── run.bat
De forma predeterminada no se genera un WAR físico. El web.xml, los recursos estáticos, las clases sin proteger, los esbozos de metadatos y las implementaciones protegidas están todos en protected/<contexto>.p4jx, que se presenta a Tomcat mediante el WebResourceSet de P4JX.
4. Arranque y parada
En primer plano:
./run.sh
En segundo plano, al estilo de Tomcat:
./bin/startup.sh
./bin/shutdown.sh
En Windows se usan los .bat correspondientes. Los registros se escriben en el directorio logs/ de la salida.
Para destinos Windows puede generar además un iniciador nativo que arranca el Tomcat integrado en primer plano; 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 indíquelas en la línea de comandos:
p4j tomcat app.war dist \
--context /app \
--jvm-option -Xms1g \
--jvm-option -Xmx2g
Para cambiarlas en un paquete ya desplegado:
- macOS y Linux: edite
bin/catalina.shy añadaJVM_OPTS+=("-Xms1g" "-Xmx2g")después de la líneaJVM_OPTS=(...)dentro derun_java(). Vale tanto para la ejecución en primer plano como para el arranque mediantestartup.sh. - Windows, primer plano: edite
bin\catalina.baty añadaset "JVM_OPTS=%JVM_OPTS% -Xms1g -Xmx2g"después de la líneaset "JVM_OPTS=..."existente. - Windows, segundo plano: añada
set "APP_JAVA_OPTS=-Xms1g -Xmx2g"enbin\startup.batantes de que llame acatalina.bat. Si necesita un único conjunto de opciones permanentes para ambos casos, resulta más sencillo regenerar el paquete desde la interfaz o la línea de comandos.
También puede anteponer APP_JAVA_OPTS al comando para que valga solo en esa ejecución. Los ejemplos completos para CMD, PowerShell y scripts están en Opciones de inicio de la JVM.
5. Elegir la versión de Tomcat
| Espacio de nombres de la API en el WAR | Tomcat | Java necesario |
|---|---|---|
javax.servlet.* | Tomcat 9 | Java 8, 11, 17, 21 o 25 |
jakarta.servlet.* | Tomcat 10.1 | Java 11, 17, 21 o 25 |
La detección automática identifica primero el espacio de nombres a partir de las clases de la aplicación y los descriptores de despliegue; los nombres de los JAR solo sirven como indicio secundario. Si conviven javax y jakarta, la herramienta no arriesga una suposición.
6. JSP
Cuando un WAR contiene archivos JSP, se precompilan durante la codificación en clases de servlet y asignaciones de URL. Compilar los JSP en tiempo de ejecución definiría clases nuevas desde el directorio de trabajo de Tomcat, fuera del límite que el entorno protegido permite para definir clases.
Puede controlarlo de forma explícita:
--precompile-jsp
--no-precompile-jsp
En producción, mantenga la precompilación predeterminada. Desactivarla puede dejar sin cargar las páginas de una aplicación basada en JSP.
7. Alcance de la protección y reglas de exclusión
De forma predeterminada se protegen las clases de aplicación bajo WEB-INF/classes, y WEB-INF/lib queda fuera. Las clases orientadas a la web pueden excluirse:
p4j tomcat app.war dist \
--context /app \
--exclude 'com.example.web.**,com.example.dto.**'
Excluya primero los servlets, los filtros y los escuchadores, y también los DTO, las clases de configuración, las entidades, las clases puente de JNI y todo lo que el contenedor deba ampliar. El escaneo de compatibilidad ofrece recomendaciones conservadoras.
8. Añadir otra aplicación al mismo paquete de Tomcat
p4j tomcat second.war dist \
--append-app \
--context /second
Restricciones:
- la ruta de contexto no debe coincidir con la de una aplicación existente;
- la aplicación existente y la nueva deben compartir versión principal de Tomcat, versión de Java y plataforma de destino;
- sin
--append-app, la herramienta se niega a escribir en un paquete de Tomcat existente; - en la interfaz gráfica, marque Añadir la aplicación a una carpeta Tomcat existente y elija el directorio ya creado.
9. Nota sobre Java 8
En los destinos de Java 8 se activa automáticamente la capa ZIP, para que el WebResourceSet de Tomcat pueda abrir el archivo protegido.