Распространение приложений JavaFX, использующих автоматические модули
Я создал приложение JavaFX. Он отлично работает в моей Intellij IDE. Теперь я хочу распространить приложение, то есть я хочу получить установщик, который пользователи могут загрузить, а затем он установит для них приложение.
Я нашел очень интересную статью об этом здесь . Эта статья в блоге в основном описывает то, чего я хочу достичь. Однако есть два отличия:
Я использую Maven, а не Gradle
У меня есть зависимости, которые используют автоматические модули, такие как iText7 и apache.commons.lang3.
Использование автоматов очень усложняет работу. Существует проект GitHub под названием ModiTect (здесь ), который был написан для решения этих проблем. У меня нет опыта использования ModiTect, и даже мои знания Maven практически отсутствуют (что означает: я действительно не знаю, что делаю в pom.xml).
Я ищу объяснение (пошаговое) о том, как интегрировать ModiTect (и, если необходимо, jpackage) в мой pom.xml, чтобы получить установщик для моего приложения JavaFX, которое использует автоматические модули (а также sqlite база данных, что не должно быть проблемой).
Может ли кто-нибудь предоставить это объяснение или порекомендовать мне учебник?
Полный минимальный рабочий пример см. В этом заархивированном проекте. Вы столкнетесь с проблемами, если просто выполните javafx:jlink.
1 ответ
Вместо плагина javafx maven вы можете использовать плагин moditect для создания недостающей информации о модуле для автоматических зависимостей модулей, а затем создать образ с помощью moditect.
Такой помпон для вас может быть что-то вроде:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.company</groupId>
<artifactId>TestApp</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<appName>TestApp</appName>
<launcherName>testapp</launcherName>
<moduleName>com.company</moduleName>
<mainClass>com.company.LoginApp</mainClass>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>15</maven.compiler.source>
<maven.compiler.target>15</maven.compiler.target>
<version.java>15</version.java>
</properties>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>15.0.1</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>15.0.1</version>
</dependency>
<dependency>
<groupId>de.jensd</groupId>
<artifactId>fontawesomefx-fontawesome</artifactId>
<version>4.7.0-9.1.2</version>
</dependency>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.34.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>kernel</artifactId>
<version>7.1.14</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>layout</artifactId>
<version>7.1.14</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>io</artifactId>
<version>7.1.14</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>${version.java}</release>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/modules</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.moditect</groupId>
<artifactId>moditect-maven-plugin</artifactId>
<version>1.0.0.RC1</version>
<executions>
<execution>
<id>add-module-info-to-dependencies</id>
<phase>package</phase>
<configuration>
<outputDirectory>${project.build.directory}/modules</outputDirectory>
<overwriteExistingFiles>true</overwriteExistingFiles>
<modules>
<module>
<artifact>
<groupId>com.itextpdf</groupId>
<artifactId>kernel</artifactId>
</artifact>
<moduleInfo>
<name>kernel</name>
</moduleInfo>
</module>
<module>
<artifact>
<groupId>com.itextpdf</groupId>
<artifactId>layout</artifactId>
</artifact>
<moduleInfo>
<name>layout</name>
</moduleInfo>
</module>
<module>
<artifact>
<groupId>com.itextpdf</groupId>
<artifactId>io</artifactId>
</artifact>
<moduleInfo>
<name>io</name>
</moduleInfo>
</module>
<module>
<artifact>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
</artifact>
<moduleInfo>
<name>sqlite.jdbc</name>
</moduleInfo>
</module>
<module>
<artifact>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</artifact>
<moduleInfo>
<name>org.apache.commons.lang3</name>
</moduleInfo>
</module>
<module>
<artifact>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</artifact>
<moduleInfo>
<name>org.slf4j</name>
</moduleInfo>
</module>
</modules>
<module>
<mainClass>${mainClass}</mainClass>
<moduleInfoFile>${project.build.sourceDirectory}/module-info.java</moduleInfoFile>
</module>
<jdepsExtraArgs>
<args>--multi-release</args> <args>15</args>
<args>--ignore-missing-deps</args>
</jdepsExtraArgs>
</configuration>
<goals>
<goal>add-module-info</goal>
</goals>
</execution>
<execution>
<id>create-runtime-image</id>
<phase>package</phase>
<goals>
<goal>create-runtime-image</goal>
</goals>
<configuration>
<modulePath>
<path>${project.build.directory}/modules</path>
</modulePath>
<modules>
<module>${moduleName}</module>
</modules>
<launcher>
<name>${launcherName}</name>
<module>${moduleName}</module>
</launcher>
<compression>2</compression>
<stripDebug>true</stripDebug>
<outputDirectory>${project.build.directory}/jlink-image</outputDirectory>
<ignoreSigningInformation>true</ignoreSigningInformation>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.github.akman</groupId>
<artifactId>jpackage-maven-plugin</artifactId>
<version>0.1.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jpackage</goal>
</goals>
<configuration>
<name>${appName}</name>
<type>IMAGE</type>
<runtimeimage>${project.build.directory}/jlink-image</runtimeimage>
<module>${moduleName}/${mainClass}</module>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Мои первые тесты кажутся успешными, но некоторые элементы могут потребовать дополнительной работы (например, мне не нравится аргумент --ignore-missing-deps)
Может быть, это немного поможет вам продвинуться вперед.