Создание средства запуска Windows EXE

При сборке можно создать нативное средство запуска Windows для защищённого приложения. Это обычный исполняемый файл Win32, который запускается двойным щелчком, так что вашим пользователям не нужно устанавливать Java и вообще видеть run.bat.

EXE необязателен и создаётся только по запросу. Когда он включён, в пакете по-прежнему остаются run.sh, run.command и run.bat. Оба способа запуска используют одну и ту же структуру архива, один путь классов, один главный класс и одни параметры запуска JVM.

1. Область применения

Типы приложенийJava приложение, Spring Boot (все три макета), Tomcat
Целевые платформыwindows-x64, windows-x86, windows-aarch64
Не поддерживаетсяШифрование библиотеки — отдельный архив .p4jx не является исполняемым каталогом приложения

Нужно выбрать хотя бы одну целевую платформу Windows. Добавлять при этом цели Linux и macOS можно: их пакеты собираются как обычно, без EXE, и запускаются привычным сценарием. Если ни одной цели Windows не выбрано, задача сразу завершается с ошибкой.

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

  1. На странице входного файла и целевых платформ отметьте Создать EXE приложения для Windows (x64/x86/ARM64) и выберите хотя бы одну платформу Windows.
  2. Этот флажок расположен до разветвления на простой и расширенный режим, поэтому EXE можно получить в любом из них.
  3. После установки флажка появляется страница Средство запуска Windows EXE, где задаются имя файла, режим средства запуска, значок и сведения о версии Windows. Без флажка мастер сразу переходит к итоговой странице.
  4. Когда EXE включён, поле Параметры запуска JVM появляется только на этой странице, чтобы один и тот же параметр нельзя было ввести в двух местах. Введённое записывается и в EXE, и в сценарии запуска.
  5. Итоговая страница перечисляет платформы, для которых EXE действительно будет создан, и заполненные вами поля средства запуска.

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

Минимальная форма требует только --windows-exe:

p4j --target-platform windows-x64 javaapp app.jar dist --windows-exe

Задать имя файла и режим окна:

p4j --target-platform windows-x64 javaapp app.jar dist \
  --windows-exe \
  --exe-name MyApp.exe \
  --exe-mode gui \
  --exe-icon assets/app.ico

Собрать сразу три архитектуры Windows с полными ресурсами версии:

p4j --target-platform windows-x64,windows-x86,windows-aarch64 \
  springboot app.jar dist \
  --windows-exe \
  --exe-name MyService \
  --exe-file-version 1.4.2.0 \
  --exe-product-version 1.4.2.0 \
  --exe-company 'Example Inc.' \
  --exe-product 'Example Service' \
  --exe-description 'Example background service' \
  --exe-copyright 'Copyright (C) 2026 Example Inc.'

Пакеты Tomcat тоже поддерживаются; созданный EXE поднимает встроенный Tomcat на переднем плане:

p4j --target-platform windows-x64 tomcat app.war dist --context /demo --windows-exe

4. Параметры

ПараметрОписание
--windows-exeСоздать EXE приложения для Windows
--exe-name <name>Имя файла EXE; по умолчанию берётся имя входного файла, для пакетов Tomcat — tomcat
--exe-mode <mode>console (по умолчанию) или gui
--exe-icon <ico>Необязательный значок Windows в формате .ico
--exe-file-version <a.b.c.d>Версия файла PE: от одного до четырёх чисел, каждое от 0 до 65535. Пустое поле равно 0.0.0.0
--exe-product-version <a.b.c.d>Версия продукта PE, правила те же
--exe-company <text>Название компании
--exe-product <text>Название продукта
--exe-description <text>Описание файла; видно в диспетчере задач и свойствах файла
--exe-copyright <text>Сведения об авторских правах

Любой параметр --exe-* сам по себе включает создание EXE, так что добавлять --windows-exe не требуется.

Имя должно быть только именем файла — без /, \ и частей пути. Если суффикс .exe пропущен, он добавляется автоматически.

Оба поля версии подчиняются одному правилу: от одного до четырёх чисел, разделённых точками, каждое от 0 до 65535, например 1.0.0.1. Windows хранит каждую часть как беззнаковое 16-разрядное число, поэтому значения с буквами или пробелами — v1.0, 1.0-beta — отклоняются. Пустое поле означает 0.0.0.0. Оба поля проверяются до начала сборки, так что ошибка обнаруживается сразу, а не на середине процесса.

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

На примере приложения Java: EXE располагается в корне пакета рядом со сценариями запуска.

dist/
├── MyApp.exe             # новое средство запуска Windows
├── app.p4jx
├── vlxjre/
├── lib/
├── run.sh
├── run.command
├── run.bat
└── README.md

Файл README.md внутри пакета перечисляет созданные EXE и содержит указания по подписи кода.

6. Как ведёт себя средство запуска

Каталог с EXE считается корнем приложения. Средство запуска принимает пути к среде выполнения, архиву, пути классов и рабочему каталогу только внутри этого корня; всё, что находится вне пакета, а также всё, что подменено символьной ссылкой или точкой соединения, отклоняется, и процесс не стартует. Поэтому весь пакет можно свободно перемещать и переименовывать, но вынести из него один только EXE нельзя.

АспектПоведение
Среда выполненияВсегда используется vlxjre\bin\java.exe из самого пакета. Системная Java не применяется, JAVA_HOME не читается.
Аргументы командной строкиАргументы, переданные EXE, добавляются после собственных аргументов приложения.
Режим консолиНаследует стандартный ввод и вывод текущей консоли, ждёт завершения приложения и возвращает его код выхода.
Графический режимОкно консоли не создаётся, что удобно для настольных приложений.
Переменные окруженияПеред запуском очищаются JAVA_TOOL_OPTIONS, _JAVA_OPTIONS, JDK_JAVA_OPTIONS и CLASSPATH, чтобы извне нельзя было подставить параметры запуска.

Параметры JVM для EXE фиксируются при сборке, подписываются вместе с блоком параметров и проверяются при запуске; после развёртывания изменить их нельзя. Переменная APP_JAVA_OPTS действует только на run.bat — EXE её не читает. Чтобы изменить параметры JVM у EXE, соберите пакет заново.

По той же причине -javaagent, -agentlib, -agentpath, -Xbootclasspath и --patch-module нельзя записать в параметры запуска EXE. Передача их через --jvm-option сразу прерывает сборку с ошибкой.

7. Подпись кода

Protector4J не подписывает созданный EXE и не обращается к учётным данным Authenticode. Все изменения PE — значок, ресурсы версии и параметры запуска — выполняются во время сборки, поэтому подпись ставится последней.

  1. Завершите сборку и убедитесь, что EXE правильно запускает приложение.
  2. Поставьте подпись Authenticode своим сертификатом, включая метку времени RFC3161.
  3. Проверьте подпись по политике /pa в Windows.

После подписи не изменяйте файл PE: любая правка делает подпись недействительной. Чтобы поменять значок или номер версии, соберите и подпишите заново.

8. Поля файла задания

Экспортируемый p4j-task.yml использует вторую версию формата и при включённом EXE сохраняет следующие поля. Файлы задания первой версии по-прежнему читаются.

windowsExe: true
exeName: MyApp.exe
exeMode: console
exeIcon: assets/app.ico
exeFileVersion: 1.4.2.0
exeProductVersion: 1.4.2.0
exeCompany: Example Inc.
exeProduct: Example Service
exeDescription: Example background service
exeCopyright: Copyright (C) 2026 Example Inc.

9. Устранение неполадок

ПризнакПричина и решение
Сообщение о том, что нужна целевая платформа WindowsEXE включён, но не выбрана ни одна из windows-x64, windows-x86, windows-aarch64.
Сообщение о неверном формате версииВ поле версии есть буквы или пробелы, частей больше четырёх, либо одна из них вне диапазона 0–65535.
Сообщение о том, что имя EXE должно быть только именем файлаВ имени есть разделитель пути. Укажите имя без каталогов.
Сообщение о том, что файл значка не найден--exe-icon указывает на несуществующий .ico. Проверьте путь.
После двойного щелчка окно не появляется, приложение сразу закрываетсяПриложение не стартует в графическом режиме. Соберите пакет в режиме консоли и посмотрите вывод ошибок.
Скопированный отдельно EXE не работаетСредству запуска нужны среда выполнения и архив в том же каталоге пакета. Скопируйте весь каталог вывода.

Полный список параметров приведён в Справочнике по командной строке; работа мастера описана в Руководстве по графическому интерфейсу.