Защита обычных приложений Java

javaapp работает с обычными приложениями Java, у которых есть главный класс. Он создаёт защищённый архив, VLX JRE для каждой целевой платформы и сценарии запуска.

1. В графическом интерфейсе

  1. На странице типа приложения выберите Java приложение.

    Выбор пункта «Java приложение»

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

    Выбор ввода, версии Java, целевой платформы и режима

  3. В расширенном режиме при необходимости заполните Основной класс и задайте параметры запуска JVM, настройки JavaFX и правила исключения. В простом режиме эта страница пропускается. Значение каждого параметра описано в разделе Настройки расширенного режима Protector4J.

    Настройка расширенных параметров обычного приложения Java

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

    Выбор каталога вывода и запуск защиты

2. Примеры для командной строки

Если в манифесте уже объявлен нужный Main-Class:

p4j javaapp app.jar dist

Если Main-Class в манифесте нет или требуется запуск с другого класса, укажите его через --main:

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

Главный класс и параметры JVM одновременно:

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

Защита только части приложения:

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

Сканирование совместимости и автоматическое применение рекомендаций:

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

Эти два параметра нельзя использовать вместе. Различие такое:

ПараметрЧто делаетКогда применять
--compat-scanСканирует входной JAR, выводит риски и рекомендации по настройке и завершает работу. Ничего не кодируется и dist не создаётся, поэтому каталог вывода не нужен.Сначала прочитайте отчёт при первой защите, после обновления зависимостей или изменения области защиты, а также при поиске проблем совместимости.
--compat-applyСканирует, применяет осторожные рекомендации и продолжает кодирование с записью результата, поэтому каталог вывода обязателен.Используйте для завершения сборки, когда вы уже прочли результаты сканирования и приняли рекомендации. Подходит и для повторных сборок и конвейеров CI с проверенными правилами.

Для javaapp параметр --compat-apply может добавить правила исключения по результатам сканирования и изменить ZIP-слой, JavaFX и суффикс архива. Для этих трёх пунктов приоритет имеет значение, заданное явно в командной строке. Рекомендованные исключения по умолчанию объединяются с вашими шаблонами --exclude; если это не нужно, добавьте --no-compat-excludes. Сканер выполняет только статический эвристический анализ, поэтому проблемы, требующие правки кода, --compat-apply не устраняет, и собранное приложение всё равно нуждается в регрессионном тестировании на целевой платформе.

Остальные команды, полный список параметров, переменные окружения и примеры автоматизации приведены в Справочнике по командной строке.

3. Структура вывода

dist/
├── app.p4jx              # с --archive-suffix jar становится app.jar
├── vlxjre/               # среда выполнения, соответствующая архиву и платформе
├── lib/                  # зависимости из Class-Path манифеста, необязательно
├── run.sh
├── run.command
├── run.bat
└── README.md

Ресурсы, не являющиеся классами, хранятся в публичном представлении ресурсов архива P4JX. Защищённые классы показывают сканерам только заготовку метаданных; настоящие тела методов может загрузить лишь среда выполнения VLX.

4. Запуск

./run.sh [аргументы приложения...]

В Windows:

run.bat [аргументы приложения...]

Не заменяйте каталог vlxjre в выводе системной JRE. Если приложение всё же нужно запустить вручную, возьмите созданный сценарий за образец и сохраните его путь классов, параметры VM и параметры модулей JavaFX.

Для целей Windows можно дополнительно создать нативное средство запуска, работающее по двойному щелчку. Оно существует наряду со сценариями запуска — см. Создание средства запуска Windows EXE.

Параметры запуска JVM

При сборке вводите по одному параметру в строке в поле Параметры запуска JVM графического интерфейса либо повторяйте ключ в командной строке:

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

Чтобы изменить их насовсем в уже развёрнутом каталоге:

  • macOS и Linux: отредактируйте run.sh и добавьте JVM_OPTS+=("-Xms512m" "-Xmx2g") перед проверкой APP_JAVA_OPTS. Файл run.command вызывает тот же run.sh.
  • Windows: отредактируйте run.bat и добавьте set "JVM_OPTS=%JVM_OPTS% -Xms512m -Xmx2g" перед проверкой APP_JAVA_OPTS.

Разовые параметры можно передать через APP_JAVA_OPTS. Полные примеры и оговорки — в разделе Параметры запуска JVM. Ручные правки сценариев затираются при повторной сборке.

5. Рекомендуемая область защиты

По умолчанию защищаются собственные классы приложения. Для промышленных проектов лучше явно указать свои бизнес-пакеты:

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

Классы, которые обычно стоит исключить:

  • DTO и record-классы, которые Jackson сериализует и десериализует напрямую;
  • классы, к полям или методам которых обращаются через JNI;
  • классы, которые должен переписывать ORM, контейнер внедрения зависимостей или фреймворк прокси;
  • сторонние библиотеки и фреймворки с открытым исходным кодом;
  • классы, которые собственный ClassLoader переопределяет из массива байтов.

6. Суффиксы .p4jx и .jar

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

Этот параметр меняет только имя файла; содержимое архива остаётся форматом P4JX. Применяйте его лишь тогда, когда сторонний компонент жёстко ожидает .jar в URL или имени файла. Обычным ZIP или JAR архив от этого не становится.