如何为JavaFX项目配置Maven POM文件,如果部署到与JavaFX/OpenJFX技术捆绑的JVM?

laawzig2  于 2023-08-03  发布在  Maven
关注(0)|答案(1)|浏览(156)

至少有几家供应商提供了其JDK/JRE产品版本,这些版本捆绑了 JavaFX 技术的 OpenJFX 实现。即 * 阿苏尔Systems* 和 BellSoft
如果将JavaFX应用程序部署到用户的机器上,而这些机器已经安装了与JavaFX技术捆绑的JVM,我如何编写驱动我构建的Maven POM的依赖项和执行部分?

依赖关系

👉🏼如果我知道有一个与OpenJFX捆绑的JVM,我是否想 * 不 * 将任何OpenJFX库与我的应用捆绑?
如果是这样,我如何编写POM,使OpenJFX库在开发时对我可用,但不将它们包含在最终的JAR文件中?
目前,我有IntelliJ提供的JavaFX project template给我的:

<dependencies>

    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>20.0.2</version>
    </dependency>

    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>20.0.2</version>
    </dependency>

    <dependency>
        <groupId>org.controlsfx</groupId>
        <artifactId>controlsfx</artifactId>
        <version>11.1.2</version>
    </dependency>
…

字符串

javafx-maven-plugin的执行

👉🏼如果我只想构建一个JAR而不绑定JVM或本机映像,我该如何配置POM中javafx-maven-plugin元素的executions元素?
现在,我有以下内容,由IntelliJ提供的JavaFX项目模板给出:

<plugin>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-maven-plugin</artifactId>
    <version>0.0.8</version>
    <executions>
        <execution>
            <!-- Default configuration for running with: mvn clean javafx:run -->
            <id>default-cli</id>
            <configuration>
                <mainClass>work.basil.voters.voters_wa/work.basil.voters.voters_wa.HelloApplication</mainClass>
                <launcher>app</launcher>
                <jlinkZipName>app</jlinkZipName>
                <jlinkImageName>app</jlinkImageName>
                <noManPages>true</noManPages>
                <stripDebug>true</stripDebug>
                <noHeaderFiles>true</noHeaderFiles>
            </configuration>
        </execution>
    </executions>
</plugin>


下面是整个POM。

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>work.basil.voters</groupId>
    <artifactId>voters_wa</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>Voters WA</name>
    <description>Parses Washington State voter registration data, then providing access via queries and reporting. For political purposes only. Commercial use of that data is prohibited by law.</description>
    <inceptionYear>2023</inceptionYear>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.plugin.validation>VERBOSE</maven.plugin.validation>
    </properties>

<dependencies>

    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>20.0.2</version>
    </dependency>

    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>20.0.2</version>
    </dependency>

    <dependency>
        <groupId>org.controlsfx</groupId>
        <artifactId>controlsfx</artifactId>
        <version>11.1.2</version>
    </dependency>

        <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.10.0</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.11.0</version>
                <configuration>
                    <source>20</source>
                    <target>20</target>
                </configuration>
            </plugin>
<plugin>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-maven-plugin</artifactId>
    <version>0.0.8</version>
    <executions>
        <execution>
            <!-- Default configuration for running with: mvn clean javafx:run -->
            <id>default-cli</id>
            <configuration>
                <mainClass>work.basil.voters.voters_wa/work.basil.voters.voters_wa.HelloApplication</mainClass>
                <launcher>app</launcher>
                <jlinkZipName>app</jlinkZipName>
                <jlinkImageName>app</jlinkImageName>
                <noManPages>true</noManPages>
                <stripDebug>true</stripDebug>
                <noHeaderFiles>true</noHeaderFiles>
            </configuration>
        </execution>
    </executions>
</plugin>
        </plugins>
    </build>
</project>

lndjwyie

lndjwyie1#

使用Maven处理已经包含JavaFX的JDK和运行时的简短指南:

  • 阿苏尔Zulu“JDK FX”和“JRE FX”。
  • BellSoft Liberica“完整JDK”或“完整JRE”。

开发

对于开发,您有以下选择:
1.在pom.xml中包含JavaFX maven依赖项,并使用不包含JavaFX的JDK。
1.在pom.xml中包含JavaFX maven依赖项,并使用包含JavaFX的JDK。
1.不要将JavaFX maven依赖项放在pom.xml中,并使用包含JavaFX的JDK。
1.将JavaFX maven依赖项作为provided scope包含在pom.xml中,并使用包含JavaFX的JDK。
| 情景JavaFX依赖项|包含在POM中JDK捆绑|关于OpenJFX评论| Comment |
| --|--|--| ------------ |
| ✅||更便于与开发人员🚫共享| More portable for sharing with developers |
| ✅| ✅|||
| |✅🚫|||
| ✅| <scope>provided</scope>个✅|·当所有开发人员 * 和 * 所有用户都安装了适当的JDK/JRE与JavaFX时,最精简的选项|·也适用于阴影JAR中的非模块化应用程序· Also for non-modular app in shaded JAR |
任何一个选项都可以。
如果您与其他开发人员共享项目,选项1可能是最可移植的。这样,开发人员就不必特别小心地寻找和使用包含JavaFX的JDK(这比没有JavaFX的JDK要少得多)。
如果您知道所有开发人员都将使用包含JavaFX的适当JDK,或者您的目标是为应用程序构建非模块化的shaded jar,则选项4可能是最佳选择。通过使用scope provided,您的最终应用程序工件将缺少OpenJFX库,从而产生更小的尺寸。

分发

对于分发,您不需要包含JavaFX maven jar,因为您知道目标平台将具有这些jar。
当您构建应用程序时,默认情况下,它将为应用程序创建一个jar文件。且该jar文件将不包括依赖代码。这是maven-jar-plugin的默认执行,它隐式地包含在maven发行版中,因此您不需要任何配置就可以在其默认模式下使用它。
即使您不需要JavaFX模块作为依赖项,您也需要应用所需的任何其他依赖项。如果它是一个简单的应用程序,没有其他依赖项,那么你不需要担心这一点。但如果它不是一个简单的应用程序,那么你需要一种方法来包含这些依赖项。
如果它是一个modular应用程序,你可以创建一个依赖jar的zip,你的应用程序jar和一个执行脚本。执行脚本的工作是找到Java命令并使用它来运行应用程序,其中包含模块路径上的依赖模块。
这可以使用maven-assembly plugin来完成,它可以配置为:
1.将应用程序jar复制到程序集目录。
1.将应用程序依赖项(不包括JavaFX依赖项)复制到程序集目录。
1.将执行脚本复制到程序集目录。
1.为发行版创建zip文件。
如果你在程序集中包含了JavaFX maven jar,如果它是一个模块化的应用程序,它可能仍然可以工作,只是在你的情况下没有必要。它们可以通过在项目中不作为依赖项来排除,或者如果它们存在,则在程序集定义中将其过滤掉(by filtering out all dependencies from the org.openjfx group id)。
如果它是一个非模块化的应用程序,您可以使用shade plugin,将您的应用程序代码和从属库中的所有代码隐藏到单个jar文件中。如果使用此选项,则不要将依赖项放在项目文件中的JavaFX Maven工件上(或使用为其提供的范围),因为您不希望将JavaFX代码隐藏到jar文件中,当底层平台已经提供JavaFX时,这只会造成混乱。在这种情况下,您应该使用包含JavaFX的JDK进行开发。

提供的作用域

如果需要,可以为JavaFX jar设置所提供的范围,以表明它们不需要作为应用程序的运行时依赖项捆绑在一起,因为它们已经是目标平台的一部分,但在开发和构建时仍然可用,以便您可以根据它们进行编译。

<scope>provided</scope>

字符串
默认情况下,设置了提供的范围后,基于依赖项运行的任务(如着色或部件复制任务)也不会复制提供的依赖项,因为这些任务知道不需要它们。
在这种情况下,使用JavaFX依赖项的提供范围来定位已经包含JavaFX的运行时,类似于在Web开发中使用servlet API依赖项的提供范围来定位包含Java servlet API的Web应用程序服务器。

常见问题

如果我只想构建一个JAR,而不想绑定JVM或本机映像,那么如何在POM中配置javafx-maven-plugin元素的executes元素?
如果你没有通过javafx-maven-plugin使用jlink构建原生镜像,那么就没有必要使用它,你可以从项目中删除它。

除了链接功能之外,javafx-maven-plugin 还具有启动JavaFX应用程序的能力。我不使用它,而是依靠我的IDE执行能力来运行我的应用程序。但是如果你习惯使用 javafx-maven-pluginjavax:run目标,你可以保留这个插件。

相关问题