至少有几家供应商提供了将JavaFX技术的OpenJFX实现Bundle 在一起的JDK/JRE产品版本.即Azul SystemsBellSoft.

如果将JavaFX个应用程序部署到已经安装了与JavaFX技术Bundle 的JVM的用户计算机上,我如何编写驱动我的构建的Maven POM的依赖项和执行部分?

相依性

??如果我知道存在与OpenJFXBundle 在一起的JVM,我是否想要在我的应用程序中Bundle 任何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>
…

Executions of javafx-maven-plugin

??如果我只想构建一个JAR,而不想Bundle 任何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>

推荐答案

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

  • Azul Zulu"JDK FX"和"JRE FX".

  • BellSoft Liberica"Full JDK"或"Full JRE".

Development

对于开发,您有以下 Select :

  1. 在pom.xml中包含JavaFX maven依赖项,并使用不包含JavaFX的JDK.
  2. 在pom.xml中包含JavaFX maven依赖项,并使用包含JavaFX的JDK.
  3. 不要将JavaFX maven依赖项放在pom.xml中,而要使用包含JavaFX的JDK.
  4. 将JavaFX maven依赖项作为提供的作用域包含在pom.xml中,并使用不包含JavaFX的JDK.

任何选项都将起作用.

如果您与其他开发人员共享项目,选项1可能是最可移植的.这样,开发人员就不必特别小心地查找和使用包含JavaFX的JDK(这比没有JavaFX的JDK要少得多).

如果您知道所有开发人员都将使用包含JavaFX的合适的JDK,或者如果您的目标是为应用程序构建一个非模块化的shaded jar,那么选项4可能是最好的.

Distribution

对于发行版,您不需要包含JavaFX maven JAR,因为您知道您的目标平台将拥有这些JAR.

默认情况下,当您构建应用程序时,它将为应用程序创建一个JAR文件.并且该JAR文件将不包括依赖代码.这是maven-jar-plugin的默认执行,它隐含在maven发行版中,因此您不需要任何配置就可以在其默认模式下使用它.

尽管您不需要将JavaFX模块作为依赖项,但您确实需要应用程序需要的任何其他依赖项.如果它是一个简单的应用程序,没有其他依赖,那么你就不需要担心这一点.但如果它不是一个简单的应用程序,那么你需要找到一种方法来包括这些依赖项.

如果它是一个modular的应用程序,您可以创建依赖JAR的压缩包、您的应用程序JAR和一个执行脚本.执行脚本的任务是找到Java命令,并使用它来运行您的应用程序,使其具有模块路径上的依赖模块.

这可以使用maven-assembly plugin来完成,它可以配置为:

  1. 将您的应用程序JAR复制到程序集目录.
  2. 将您的应用程序依赖项(不包括JavaFX依赖项)复制到程序集目录.
  3. 将执行脚本复制到程序集目录.
  4. 为发行版创建压缩文件.

如果您确实在程序集中包含了JavaFX maven Jars,如果它是一个模块化的应用程序,它可能仍然可以工作,只是在您的情况下不是必需的.可以通过在项目开始时不将它们作为依赖项来排除它们,或者如果它们存在,则在程序集定义中将它们过滤掉(by filtering out all dependencies from the org.openjfx group id).

如果它是非模块化应用程序,您可以使用shade plugin将您的应用程序代码和依赖库中的所有代码着色到单个JAR文件中.如果您使用此选项,则不要在项目文件中放置对JavaFX Maven构件的依赖项(或使用为它们提供的作用域),因为您不想将JavaFX代码隐藏到您的JAR文件中,这只会在底层平台已经使JavaFX可用时造成混乱.在这种情况下,您应该使用包含JavaFX的JDK进行开发.

Provided scope

如果需要,可以为JavaFX JAR设置作用域provided,以指示它们不需要作为应用程序的运行时依赖项Bundle 在一起,因为它们已经是目标平台的一部分,但在开发和构建时仍然可用,因此您可以针对它们进行编译.

<scope>provided</scope>

默认情况下,设置提供的范围时,基于依存关系工作的任务(如着色或集合复制任务)不会同时复制提供的依存关系,因为这些任务知道不需要它们.

在这种情况下,针对已经包括JavaFX的运行时使用提供的范围用于JavaFX依赖项,类似于在以包括Java Servlet API的Web应用程序服务器为目标时,在Web开发中使用针对Servlet API依赖项的提供的范围.

FAQ

如果我只想构建一个JAR而不Bundle 任何JVM或本机映像,如何在POM中配置我的JavaFX-maven-plugin元素的Executions元素?

您不需要.如果您不是通过javafx-maven-plugin使用jlink构建本地镜像,那么就没有必要使用它,您可以将其从项目中删除.

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

Java相关问答推荐

编译期间错误(Java 0000)Android .Net MAUI

try Dockerize Maven应用程序,但发布版本21不支持"

Kubernetes的Java客户端检索状态.处于终止状态的Pod的阶段';正在运行';

Spring Boot Maven包

如何解释Java中for-each循环中对Iterable的强制转换方法引用?

声明带有泛型的函数以用作查找映射中的值

如何使用log4j2(Json)记录由";异常引起的所有";?

有没有可能在时间范围内得到多种解决方案?

在Ubuntu 23.10上使用mp3创建JavaFX MediaPlayer时出错

从映射列表中检索所有键

在Oracle db中,当我们提供字符串而不是数字时,比较是如何工作的?

每次我需要时创建和关闭数据库连接会有什么效果吗?

如何在字节数组中反转UTF-8编码?

在Eclipse中可以使用外部字体吗?

Java集合:NPE,即使没有添加空值

如何利用OpenTelemeter将初始值(零)输出到普罗米修斯

spring 数据Elastic search 与 spring 启动数据Elastic search 之间的区别是什么?

使用StringBuilder和append方法创建字符串时Java字符串内部方法的问题

如何使用命令行为Java应用程序生成烟雾测试用例

为什么 log4j 过滤器在appender中不起作用