Защита приложений Spring Boot
springboot защищает приложения Spring Boot и обрабатывает BOOT-INF/classes, BOOT-INF/lib, загрузчик Spring Boot и обход фреймворка.
1. В графическом интерфейсе
-
На странице типа приложения выберите Spring Boot.

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

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

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

2. Примеры для командной строки
Самая короткая форма:
p4j springboot app.jar dist
По умолчанию используется макет p4jx-fat. Чтобы выбрать другой явно:
p4j springboot app.jar dist --layout fat
p4j springboot app.jar dist --layout separate
Защита только части приложения:
p4j springboot app.jar dist \
--protect 'com.example.service.impl.**' \
--exclude 'com.example.dto.**,com.example.config.**'
3. Структура вывода и макеты
p4jx-fat: макет по умолчанию, единый защищённый архив
dist/
├── app.p4jx # с суффиксом jar становится app.jar
├── vlxjre/
├── run.sh
├── run.command
└── run.bat
Особенности:
- всё приложение поставляется одним архивом P4JX;
- физический файл по умолчанию не является ZIP;
- ресурсы Spring Boot, вложенные зависимости и метаданные предоставляются через виртуальное представление JAR;
- область защиты самая широкая; подходит приложениям, не полагающимся на сторонние сканеры пути классов.
fat: макет совместимости со Spring Boot
dist/
├── app.jar
├── app.p4jx # с суффиксом jar становится app-protected.jar
├── vlxjre/
└── run.*
Особенности:
app.jarсохраняет стандартную физическую структуруBOOT-INF;- настоящие реализации защищённых классов находятся в соседнем архиве P4JX;
- подходит приложениям, которым нужно обходить физическую структуру JAR Spring Boot, например при использовании ClassGraph или Reflections;
- файлы зависят друг от друга, их нужно обновлять и поставлять вместе.
separate: раздельный макет совместимости
dist/
├── plain-launcher.jar
├── app.p4jx
├── lib/
├── vlxjre/
└── run.*
Особенности:
- загрузчик Spring Boot, незащищённые классы и зависимости разнесены;
- подходит старым средам интеграции, где нужен плоский путь классов
lib/*; - созданное средство запуска предварительно загружает защищённые классы;
- для новых проектов предпочтителен
p4jx-fatлибо тот изp4jx-fatиfat, который рекомендует сканер.
Как выбрать макет
| Ситуация | Рекомендуемый макет |
|---|---|
| Обычная служба Spring Boot | p4jx-fat |
| Приложение действительно использует сканер вроде ClassGraph или Reflections | fat |
| Нужен плоский каталог внешних зависимостей или их отдельное шифрование | separate |
| Сомневаетесь | Сначала выполните --compat-scan |
ZIP-слой помогает только средствам, читающим центральный каталог ZIP напрямую. Он не заменяет физическую структуру Spring Boot, необходимую ClassLoader и сканерам пути классов.
4. Запуск
./run.sh --spring.profiles.active=prod
В Windows:
run.bat --spring.profiles.active=prod
Не заменяйте каталог vlxjre в выводе системной JRE.
Для целей Windows можно дополнительно создать нативное средство запуска. Оно работает со всеми тремя макетами и существует наряду со сценариями запуска — см. Создание средства запуска Windows EXE.
Параметры запуска JVM
Параметры можно зафиксировать при сборке: по одному в строке в поле Параметры запуска JVM графического интерфейса либо в командной строке:
p4j springboot app.jar dist \
--jvm-option -Xms1g \
--jvm-option -Xmx2g
Чтобы добавить параметры к уже развёрнутому пакету на один запуск:
APP_JAVA_OPTS="-Duser.timezone=Europe/Moscow" ./run.sh
Можно и напрямую отредактировать развёрнутый сценарий:
- macOS и Linux: в
run.shдобавьтеJVM_OPTS+=("-Xms1g" "-Xmx2g")после созданных строкJVM_OPTS=(...)иJVM_OPTS+=(...). - Windows: в
run.batдобавьтеset "JVM_OPTS=%JVM_OPTS% -Xms1g -Xmx2g"после созданной строкиset "JVM_OPTS=...".
Не удаляйте параметры, созданные упаковщиком для Spring Boot или JavaFX, например --add-opens и путь модулей. Повторная сборка затирает любые ручные правки — подробности в разделе Параметры запуска JVM.
5. Область защиты
По умолчанию защищаются классы приложения в BOOT-INF/classes. Следующие связанные со Spring классы обычно лучше оставить незащищёнными:
- классы
@Controller,@RestControllerи@ControllerAdvice; - классы
@Configuration, классы автоконфигурации и классы, дополненные AOT или CGLIB; - DTO для Jackson, сущности JPA, record-классы и модели валидации;
- точка входа приложения и любые классы, которые фреймворк создаёт или оборачивает в прокси напрямую;
- классы, требующие изменения байт-кода во время выполнения.
Защищайте реализации служб и обращайтесь к ним через публичный фасад или интерфейс. Правила принимают точные имена классов, а также pkg.* и pkg.**.
6. Защита JAR зависимостей
--protect-lib защищает подходящие зависимости в BOOT-INF/lib и работает со всеми тремя макетами.
p4j springboot app.jar dist \
--protect-lib 'company-core-*.jar,pricing-*.jar'
Защищайте только собственные зависимости с закрытым исходным кодом. Не шифруйте сторонние фреймворки — Spring, Tomcat, библиотеки журналирования, драйверы баз данных — из соображений «защитить побольше».
7. Сканирование совместимости
p4j springboot app.jar --compat-scan
p4j springboot app.jar dist --compat-apply
Эти два параметра нельзя использовать вместе. Различие такое:
| Параметр | Что делает | Когда применять |
|---|---|---|
--compat-scan | Сканирует входной JAR, выводит риски и рекомендации по настройке и завершает работу. Ничего не кодируется и dist не создаётся, поэтому каталог вывода не нужен. | Сначала прочитайте отчёт при первой защите, после обновления Spring Boot или других зависимостей, после изменения области защиты или макета, а также при поиске проблем совместимости. |
--compat-apply | Сканирует, применяет осторожные рекомендации и продолжает кодирование с записью результата, поэтому каталог вывода обязателен. | Используйте для завершения сборки, когда вы уже прочли результаты сканирования и приняли рекомендации. Подходит и для повторных сборок и конвейеров CI с проверенными правилами. |
Для springboot параметр --compat-apply может выбрать макет, добавить правила исключения и изменить ZIP-слой, JavaFX и суффикс архива. Для всего, кроме исключений, приоритет имеет значение, заданное явно в командной строке. Рекомендованные исключения по умолчанию объединяются с вашими шаблонами --exclude; если это не нужно, добавьте --no-compat-excludes. Сканер выполняет только статический эвристический анализ, поэтому проблемы, требующие правки кода, --compat-apply не устраняет, и собранное приложение всё равно нуждается в регрессионном тестировании на целевой платформе.
Остальные команды, полный список параметров, переменные окружения и примеры автоматизации приведены в Справочнике по командной строке.