Создание запускающего файла Windows EXE

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

Файл EXE является опциональным и по умолчанию не генерируется. При его включении в сгенерированный пакет также сохраняются исходные файлы run.sh / run.command / run.bat; оба способа запуска используют абсолютно одинаковые архивы, классовые пути, главный класс и параметры JVM.

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

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

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

2. Работа с интерфейсом GUI

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

3. Примеры CLI

Самая простая форма — достаточно использовать --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
--exe-name <name>Имя файла EXE; если поле оставлено пустым, используется имя входного файла, для Tomcat — tomcat
--exe-mode <mode>console (по умолчанию) или gui
--exe-icon <ico>Файл иконки для Windows, формат .ico, факультативно
--exe-file-version <a.b.c.d>Версия файла PE
--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 он добавляется автоматически.

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

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

В качестве примера Java Application: 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, просто добавляются в конец параметров приложения без изменений.
Режим консолиПовторяет стандартный ввод/вывод текущей консоли, ожидает завершения приложения и возвращает его код выхода.
Режим GUIНе создаётся окно консоли; подходит для десктопных приложений.
Переменные средыПеред запуском очищаются JAVA_TOOL_OPTIONS, _JAVA_OPTIONS, JDK_JAVA_OPTIONS и CLASSPATH, чтобы предотвратить изменение параметров запуска в результате внешнего вмешательства.

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

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

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

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

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

После подписи не изменяйте этот файл PE — любые изменения приведут к аннулированию подписи. Если требуется заменить иконку или номер версии, пакуйте файл заново и подпишите его снова.

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

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

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. Часто встречающиеся вопросы

СимптомыПричины и способы решения
Отображается уведомление о необходимости целевой платформы WindowsРежим EXE включен, но не выбрано ни одно из объектов windows-x64, windows-x86 или windows-aarch64
Получено сообщение об неверном формате номера версии.В поле версии присутствуют буквы, пробелы или более 4 сегментов; кроме того, один из сегментов находится в диапазоне за пределами от 0 до 65535.
Получено сообщение о том, что имя файла EXE может содержать только имя файла.В имени файла присутствуют разделители путей; измените его на имя без указания каталога.
Получено сообщение об отсутствии файла иконки.Файл .ico, на который указывает --exe-icon, отсутствует; проверьте путь.
При двойном клике происходит сбой с закрытием приложения без отображения окна.Приложение не запускается в режиме GUI; для просмотра сообщений об ошибках пересоберите его в режиме консоли.
Отдельно скопированный EXE не может быть запущен.Для работы стартера необходимо, чтобы исходный файл и архив находились в одном каталоге пакета; пожалуйста, скопируйте весь каталог выходных файлов.

Полный список опций CLI приведён в Справка по параметрам CLI, а процесс работы с графическим интерфейсом-маршрутизатором — в Руководство по использованию GUI.