Сборка программы: jlink и jpackage
У пользователя записной книжки нет ни JDK, ни Maven, ни библиотек JavaFX. Ему нужна папка с программой или установщик. Для этого в JDK есть два инструмента. jlink собирает урезанную среду выполнения Java — только те модули, которые нужны приложению, вместе с самим приложением. jpackage упаковывает такую среду в привычный вид: программу с файлом .exe или установщик .msi, .dmg, .deb.
Почему важны модули
jlink работает только с именованными модулями — у каждой библиотеки должен быть свой module-info. У JavaFX 25 и Jackson 3 он есть, поэтому наш проект собирается без доработок. По requires в module-info.java jlink находит всё, что нужно, и ничего лишнего не берёт.
Настройка плагина
javafx-maven-plugin умеет вызывать jlink. Добавьте параметры в его configuration:
<!-- pom.xml — плагин javafx-maven-plugin -->
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.8</version>
<configuration>
<mainClass>com.example.notes/com.example.notes.App</mainClass>
<options>
<option>--enable-native-access=javafx.graphics</option>
</options>
<launcher>notes</launcher>
<jlinkImageName>notes</jlinkImageName>
<jlinkZipName>notes</jlinkZipName>
<stripDebug>true</stripDebug>
<noHeaderFiles>true</noHeaderFiles>
<noManPages>true</noManPages>
</configuration>
</plugin>| Параметр | Что делает |
|---|---|
launcher | Имя скрипта запуска в папке bin |
jlinkImageName | Имя папки с образом в target |
jlinkZipName | Дополнительно упаковать образ в zip-архив |
stripDebug, noHeaderFiles, noManPages | Выбросить отладочную информацию, заголовочные файлы C и справку |
Сборка образа
mvn clean javafx:jlinkMaven скомпилирует проект и запустит jlink. В конце будет Building zip: ...\target\notes.zip и BUILD SUCCESS. Предупреждение The 0 argument for --compress is deprecated выводит сам jlink в ответ на параметр, который передаёт плагин, — на результат оно не влияет. В target появятся папка notes размером около 100 МБ и архив notes.zip около 32 МБ. Внутри target/notes/bin лежат Java, нужные библиотеки и скрипты запуска notes и notes.bat:
target/notes/bin/notesНа Windows запускают target\notes\bin\notes.bat. Откроется то же окно, что и через mvn javafx:run. Папку или архив можно скопировать на другой компьютер с той же операционной системой — Java там не нужна.
Программа и установщик
jpackage входит в JDK. Он берёт готовый образ и делает из него обычную программу:
jpackage --type app-image --name Notes --runtime-image target/notes --module com.example.notes/com.example.notes.App --java-options --enable-native-access=javafx.graphics --dest target/distВ target/dist/Notes появится Notes.exe (на macOS — Notes.app), запуск которого открывает окно без консоли. Тип app-image — это просто папка. Для установщика меняют --type:
| Система | Типы | Что нужно дополнительно |
|---|---|---|
| Windows | exe, msi | WiX Toolset |
| macOS | dmg, pkg | Xcode command line tools |
| Linux | deb, rpm | dpkg или rpm-build |
jpackage собирает пакет только для той системы, на которой запущен: установщик для Windows делают на Windows, для macOS — на Mac. Для иконки есть параметр --icon, для версии — --app-version.
Частая ошибка
Если хотя бы одна библиотека не модульная, jlink остановится: Error: automatic module cannot be used with jlink: jsr305 from file:///.../jsr305-3.0.2.jar. Такую библиотеку заменяют модульной версией или аналогом. Если замены нет, остаётся обычный запуск через java: всё приложение кладут в classpath, а JavaFX подключают как модули параметрами --module-path и --add-modules.