Защита веб-приложений Tomcat
tomcat превращает WAR в самодостаточную базу Tomcat. Используются компоненты Tomcat, встроенные в упаковщик; установленный на вашей машине Tomcat не затрагивается.
1. В графическом интерфейсе
-
На странице типа приложения выберите Tomcat WAR.

-
Выберите входной WAR, поставляемую версию Java и целевые платформы, затем укажите простой или расширенный режим.

-
В расширенном режиме выберите Tomcat 9 или 10.1 либо оставьте автоопределение и при необходимости задайте контекстный путь, параметры запуска JVM и правила исключения. В простом режиме версия Tomcat определяется по результатам сканирования совместимости. Значение каждого параметра описано в разделе Настройки расширенного режима Protector4J.

-
Выберите каталог вывода, просмотрите сводку и нажмите Запустить защиту.

2. Примеры для командной строки
Указание контекстного пути:
p4j tomcat app.war dist --context /app
Сканирование совместимости и автоматическое применение рекомендаций:
p4j tomcat app.war --compat-scan
p4j tomcat app.war dist --compat-apply --context /app
Эти два параметра нельзя использовать вместе. Различие такое:
| Параметр | Что делает | Когда применять |
|---|---|---|
--compat-scan | Сканирует входной WAR, выводит риски и рекомендации по настройке и завершает работу. Ничего не кодируется и dist не создаётся, поэтому каталог вывода не нужен. | Сначала прочитайте отчёт при первой защите, после обновления связанных с Tomcat зависимостей, после изменения области защиты или настроек JSP, а также при поиске проблем совместимости. |
--compat-apply | Сканирует, применяет осторожные рекомендации и продолжает кодирование с записью результата, поэтому каталог вывода обязателен. | Используйте для завершения сборки, когда вы уже прочли результаты сканирования и приняли рекомендации. Подходит и для повторных сборок и конвейеров CI с проверенными правилами. |
Для tomcat параметр --compat-apply может добавить правила исключения по результатам сканирования и изменить версию Tomcat, ZIP-слой и суффикс архива. Для этих трёх пунктов приоритет имеет значение, заданное явно в командной строке. Рекомендованные исключения по умолчанию объединяются с вашими шаблонами --exclude; если это не нужно, добавьте --no-compat-excludes. Сканер выполняет только статический эвристический анализ, поэтому проблемы, требующие правки кода, --compat-apply не устраняет, и собранное приложение всё равно нуждается в регрессионном тестировании на целевой платформе.
Остальные команды, полный список параметров, переменные окружения и примеры автоматизации приведены в Справочнике по командной строке.
Значение --tomcat-version по умолчанию — auto. Задайте 9 или 10.1, если нужно указать версию явно:
p4j tomcat app.war dist --context /app --tomcat-version 10.1
3. Структура вывода
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
Физический WAR по умолчанию не создаётся. Файл web.xml, статические ресурсы, незащищённые классы, заготовки метаданных и защищённые реализации находятся в protected/<контекст>.p4jx и передаются Tomcat через WebResourceSet из P4JX.
4. Запуск и остановка
На переднем плане:
./run.sh
В фоне, как принято в Tomcat:
./bin/startup.sh
./bin/shutdown.sh
В Windows используются соответствующие файлы .bat. Журналы пишутся в каталог logs/ внутри вывода.
Для целей Windows можно дополнительно создать нативное средство запуска, которое поднимает встроенный Tomcat на переднем плане — см. Создание средства запуска Windows EXE.
Параметры запуска JVM
При сборке вводите по одному параметру в строке в поле Параметры запуска JVM графического интерфейса либо задайте их в командной строке:
p4j tomcat app.war dist \
--context /app \
--jvm-option -Xms1g \
--jvm-option -Xmx2g
Чтобы изменить их в уже развёрнутом пакете:
- macOS и Linux: отредактируйте
bin/catalina.shи добавьтеJVM_OPTS+=("-Xms1g" "-Xmx2g")после строкиJVM_OPTS=(...)внутриrun_java(). Это действует и при работе на переднем плане, и при запуске черезstartup.sh. - Windows, передний план: отредактируйте
bin\catalina.batи добавьтеset "JVM_OPTS=%JVM_OPTS% -Xms1g -Xmx2g"после существующей строкиset "JVM_OPTS=...". - Windows, фон: добавьте
set "APP_JAVA_OPTS=-Xms1g -Xmx2g"вbin\startup.batперед вызовомcatalina.bat. Если нужен единый постоянный набор параметров для обоих случаев, проще пересобрать пакет через интерфейс или командную строку.
Можно также поставить APP_JAVA_OPTS перед командой — тогда параметры подействуют только на один запуск. Полные примеры для CMD, PowerShell и сценариев приведены в разделе Параметры запуска JVM.
5. Выбор версии Tomcat
| Пространство имён API в WAR | Tomcat | Требуемая Java |
|---|---|---|
javax.servlet.* | Tomcat 9 | Java 8, 11, 17, 21 или 25 |
jakarta.servlet.* | Tomcat 10.1 | Java 11, 17, 21 или 25 |
Автоопределение сначала выясняет пространство имён по классам приложения и дескрипторам развёртывания; имена JAR служат лишь косвенным признаком. Если используются и javax, и jakarta, средство отказывается угадывать.
6. JSP
Если в WAR есть файлы JSP, при кодировании они предварительно компилируются в классы сервлетов и сопоставления URL. Компиляция JSP во время выполнения создавала бы новые классы из рабочего каталога Tomcat — за пределами границы, в которой защищённая среда выполнения разрешает определять классы.
Этим можно управлять явно:
--precompile-jsp
--no-precompile-jsp
В промышленной среде оставьте предварительную компиляцию включённой. Без неё страницы приложения на JSP могут перестать открываться.
7. Область защиты и правила исключения
По умолчанию защищаются классы приложения в WEB-INF/classes, а WEB-INF/lib остаётся вне защиты. Классы, обращённые к вебу, можно исключить:
p4j tomcat app.war dist \
--context /app \
--exclude 'com.example.web.**,com.example.dto.**'
В первую очередь исключите сервлеты, фильтры и слушатели, а также DTO, классы конфигурации, сущности, мосты JNI и всё, что должен дополнять контейнер. Сканирование совместимости предложит осторожные рекомендации.
8. Добавление ещё одного приложения в тот же пакет Tomcat
p4j tomcat second.war dist \
--append-app \
--context /second
Ограничения:
- контекстный путь не должен совпадать с путём уже имеющегося приложения;
- существующее и новое приложения должны использовать одну и ту же основную версию Tomcat, одну версию Java и одну целевую платформу;
- без
--append-appсредство откажется писать в существующий пакет Tomcat; - в графическом интерфейсе отметьте Добавить приложение в существующую папку Tomcat и укажите уже созданный каталог.
9. Замечание о Java 8
Для целей Java 8 ZIP-слой включается автоматически, чтобы WebResourceSet из Tomcat смог открыть защищённый архив.