Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Сборка программы: 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:jlink

Maven скомпилирует проект и запустит 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:

СистемаТипыЧто нужно дополнительно
Windowsexe, msiWiX Toolset
macOSdmg, pkgXcode command line tools
Linuxdeb, rpmdpkg или 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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.