构建无 `--module-path` 和 `--add-modules` 限制的 JavaFX 胖 Jar,享受无忧部署
2024-03-05 14:40:11
构建无 --module-path
和 --add-modules
限制的 JavaFX 胖 Jar
简介
在 JavaFX 应用程序中构建胖 Jar 是常见且实用的技术,它能将应用程序及其依赖项打包为单个文件,便于分发和部署。但运行胖 Jar 时,常常需要指定繁琐的 --module-path
和 --add-modules
参数,本文将指导你构建一个不需要这些参数的胖 Jar。
步骤指南
1. 模块化应用程序
首先,将应用程序模块化,在 module-info.java
文件中指定模块名、依赖项和导出的包。以下示例将应用程序命名为 test.app
,依赖于 javafx.controls
和 javafx.fxml
模块,导出 test.app
包:
module test.app {
requires javafx.controls;
requires javafx.fxml;
opens test.app to javafx.fxml;
exports test.app;
}
2. 配置 Maven 插件
接着,在 Maven pom.xml
文件中配置插件以生成胖 Jar。maven-assembly-plugin
和 javafx-maven-plugin
插件将帮助实现此目的。添加以下依赖项:
<dependencies>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.4</version>
</dependency>
</dependencies>
在 build
部分添加以下配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>test.app.App</mainClass>
</manifest>
</archive>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>11</version>
</dependency>
</dependencies>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.4</version>
<configuration>
<mainClass>test.app.App</mainClass>
</configuration>
<executions>
<execution>
<id>default-cli</id>
</execution>
</executions>
</plugin>
3. 生成胖 Jar
运行以下命令生成胖 Jar:
mvn clean package
生成的胖 Jar 将位于 target
目录中。
4. 运行胖 Jar
现在,无需指定 --module-path
和 --add-modules
参数即可运行胖 Jar:
java -jar target/app-1.0-SNAPSHOT-jar-with-dependencies.jar
常见问题解答
-
为什么需要模块化应用程序?
为了将应用程序与其依赖项隔离并显式声明,这有助于确保应用程序的兼容性和可维护性。 -
哪些 Maven 插件用于生成胖 Jar?
maven-assembly-plugin
将依赖项打包到一个文件中,而javafx-maven-plugin
负责构建 JavaFX 应用程序。 -
生成的胖 Jar 的文件名是什么?
通常命名为app-version-jar-with-dependencies.jar
,其中app
是应用程序名称,version
是应用程序版本。 -
为什么运行胖 Jar 时不需要
--module-path
和--add-modules
参数?
Maven 插件通过将依赖项打包到 JAR 中来处理模块路径和模块,因此无需在运行时显式指定它们。 -
生成的胖 Jar 是否可以用于任何 Java 版本?
不,胖 Jar 的 Java 版本与用于编译应用程序的 Java 版本相同。
结论
通过遵循本文中的步骤,你可以构建一个 JavaFX 胖 Jar,无需在运行时指定 --module-path
和 --add-modules
参数。这简化了应用程序的分发和部署,并提供了更无缝的用户体验。