至少有几家供应商提供了其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>
型
1条答案
按热度按时间lndjwyie1#
使用Maven处理已经包含JavaFX的JDK和运行时的简短指南:
开发
对于开发,您有以下选择:
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设置所提供的范围,以表明它们不需要作为应用程序的运行时依赖项捆绑在一起,因为它们已经是目标平台的一部分,但在开发和构建时仍然可用,以便您可以根据它们进行编译。
字符串
默认情况下,设置了提供的范围后,基于依赖项运行的任务(如着色或部件复制任务)也不会复制提供的依赖项,因为这些任务知道不需要它们。
在这种情况下,使用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-plugin 的
javax:run
目标,你可以保留这个插件。