返回

构建无 `--module-path` 和 `--add-modules` 限制的 JavaFX 胖 Jar,享受无忧部署

java

构建无 --module-path--add-modules 限制的 JavaFX 胖 Jar

简介

在 JavaFX 应用程序中构建胖 Jar 是常见且实用的技术,它能将应用程序及其依赖项打包为单个文件,便于分发和部署。但运行胖 Jar 时,常常需要指定繁琐的 --module-path--add-modules 参数,本文将指导你构建一个不需要这些参数的胖 Jar。

步骤指南

1. 模块化应用程序

首先,将应用程序模块化,在 module-info.java 文件中指定模块名、依赖项和导出的包。以下示例将应用程序命名为 test.app,依赖于 javafx.controlsjavafx.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-pluginjavafx-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

常见问题解答

  1. 为什么需要模块化应用程序?
    为了将应用程序与其依赖项隔离并显式声明,这有助于确保应用程序的兼容性和可维护性。

  2. 哪些 Maven 插件用于生成胖 Jar?
    maven-assembly-plugin 将依赖项打包到一个文件中,而 javafx-maven-plugin 负责构建 JavaFX 应用程序。

  3. 生成的胖 Jar 的文件名是什么?
    通常命名为 app-version-jar-with-dependencies.jar,其中 app 是应用程序名称,version 是应用程序版本。

  4. 为什么运行胖 Jar 时不需要 --module-path--add-modules 参数?
    Maven 插件通过将依赖项打包到 JAR 中来处理模块路径和模块,因此无需在运行时显式指定它们。

  5. 生成的胖 Jar 是否可以用于任何 Java 版本?
    不,胖 Jar 的 Java 版本与用于编译应用程序的 Java 版本相同。

结论

通过遵循本文中的步骤,你可以构建一个 JavaFX 胖 Jar,无需在运行时指定 --module-path--add-modules 参数。这简化了应用程序的分发和部署,并提供了更无缝的用户体验。