Защита приложений JavaFX

JavaFX можно включить как в обычных приложениях Java, так и в настольных приложениях на Spring Boot. Облегчённая среда выполнения P4JX по умолчанию не содержит JavaFX: его нужно включить явно или доверить это сканированию совместимости.

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

  1. Для обычного приложения JavaFX выберите на странице типа приложения Java приложение. Для настольного приложения JavaFX на контейнере Spring выберите Spring Boot. Шифрование библиотеки создаёт только защищённый архив и не заменяет сборку настоящего приложения JavaFX.

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

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

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

  3. В простом режиме, если сканирование совместимости находит обращения к javafx.* или зависимости JavaFX, оно включает JavaFX автоматически и поясняет причину в результатах. Если найдено ещё и javafx.scene.web, добавляется WebView. Сканирование — статический эвристический анализ, поэтому на странице вывода ещё раз проверьте сводку по JavaFX.

  4. В расширенном режиме на вкладке Среда выполнения JavaFX отметьте Включить JavaFX в упакованную среду выполнения и выберите стратегию для WebView:

    • Авто (обнаружить javafx.scene.web) — решение принимается по тому, обращается ли приложение к javafx.scene.web;
    • Включить — WebView (fx-webkit) добавляется всегда;
    • Исключить — WebView не добавляется.

    Для обычного приложения Java вкладка выглядит так:

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

    В настольных приложениях Spring Boot используется вкладка с тем же названием:

    Вкладка среды выполнения JavaFX в расширенных параметрах Spring Boot

  5. Выбрав каталог вывода, убедитесь, что в сводке JavaFX показан как встроенный, а состояние WebView соответствует ожиданиям, и нажмите Запустить защиту. После сборки проверьте с помощью сценария запуска из пакета на каждой целевой платформе окно, FXML, ресурсы CSS и изображений, а также WebView.

Компоненты WebView занимают около 40 МБ. Если они не нужны, выберите Исключить — пакет получится меньше. Остальные настройки расширенных страниц описаны в разделе Настройки расширенного режима Protector4J.

2. Загрузка компонентов через командную строку

p4j javaapp fx-app.jar dist --javafx

Для Spring Boot с JavaFX:

p4j springboot fx-boot.jar dist --javafx

Принудительно включить или исключить WebView:

--javafx-webview
--no-javafx-webview

Средство загружает нужные компоненты с публичного сайта загрузки вашего региона — в соответствии с целевой линейкой JDK и платформой. Ни загрузка JavaFX, ни загрузка VLX JRE не требуют передавать клиенту ключ облачного хранилища.

3. Компоненты без подключения к сети

Командная строка принимает локальный каталог:

p4j javaapp fx-app.jar dist --javafx /opt/p4jx-fx

Каталог может иметь один из двух видов:

  • fx-core.tar.gz и, по желанию, fx-webkit.tar.gz;
  • уже распакованное дерево файлов JavaFX с каталогом lib/ в корне.

В графическом интерфейсе выбрать локальный каталог JavaFX нельзя, поэтому без сети пользуйтесь командной строкой.

4. FXML

Если приложение использует FXMLLoader, сканирование совместимости рекомендует включить ZIP-слой для сканеров:

p4j javaapp fx-app.jar dist --javafx --zip-overlay scanner

Ресурсы FXML, сигнатуры контроллеров и обход фреймворка нужно проверять, действительно запуская приложение на целевой платформе.

5. Java 8 и Java 11 и новее

  • Java 8 использует jfxrt.jar и модель каталогов расширений, поэтому созданным сценариям обычно не нужны параметры модулей.
  • Java 11 и новее используют модульные JAR JavaFX, и созданные сценарии сами задают отдельный путь модулей вместе с --add-modules.

Всегда запускайте через созданные run.sh, run.command или run.bat. Не указывайте путь модулей на весь каталог vlxjre/lib самостоятельно.

6. Как работает автоматическое определение

Определение опирается на обращения к классам в вашем собственном коде и на имена файлов зависимостей JAR. Байт-код всех сторонних зависимостей намеренно не просматривается: иначе необязательные интеграции с JavaFX выглядели бы как реально используемые.

Если JavaFX встроен через shading в зависимость, по имени которой это не видно, автоматическое определение может его пропустить. В таком случае явно укажите --javafx.

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

  • Защищать ли подклассы Application из JavaFX, контроллеры FXML и модели свойств, зависит от того, как они ведут себя при проверке на вашей целевой версии Java.
  • Классы-мосты, к которым обращаются напрямую через JNI или нативный код, должны оставаться незащищёнными.
  • Начните с простого режима или --compat-scan, а затем проведите регрессионные проверки создания окон, загрузки FXML, ресурсов CSS и изображений, WebView и нативных библиотек платформы.