我正在建立一个 maven 项目,它将使用 JavaFX。由于我听说 JavaFX 不附带所有版本的 Java,所以我下载了 jfxrt.jar
文件并将其放在我项目的 lib
目录中。
1) 我如何指定不应该下载依赖项(即JavaFX),但它位于lib
中?
2) 这是否意味着项目可以在任何带有 JDK 的机器上构建(而不需要 JDK 1.7 - 更新 9+)?
最佳答案
2019 最新 JavaFX 版本更新
从 Java 11 开始,JavaFX 已与 JDK 分离,因此 JavaFX 库不再自动与 JDK 安装捆绑在一起(例如在 Oracle JDK 8 发行版中)。相反,JavaFX 系统现在被设计为一组独立于 JDK 的独立库,可以通过 Maven 等工具从存储库下载这些库,供您的应用程序使用。
openjfx.io 有一个关于在 Maven 中使用 JavaFX 11+ 的简短教程:
本教程推荐使用 OpenJFX JavaFX Maven Plugin并为“hello, world”风格的应用程序提供以下示例 maven pom.xml 项目文件。
<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 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.openjfx</groupId>
<artifactId>hellofx</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>demo</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>12.0.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.2</version>
<configuration>
<mainClass>HelloFX</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
请注意 org.openjfx JavaFX maven plugin用于 Java 11+ 不同于 com.zenjava JavaFX maven plugin用于 Java 8 和 9,因此请使用适合您的 Java 版本的版本。
建议的方法
使用 Maven 构建 JavaFX 应用程序:
- 使用 com.zenjava maven JavaFX plugin使用 Java 8 和 9 AND/OR
- 使用 Java 8 或 9,并且不要为 JavaFX 指定任何类型的 Maven 依赖项或
- 使用 org.openjfx maven JavaFX plugin使用 Java 11+。
与 Java 7 不同,在 Java 8 中没有必要将 JavaFX 设置为 maven 依赖项,因为 JavaFX 位于标准 Java 运行时类路径上(类似于今天的 Swing 方式)。
意见
我认为您将 jfxrt.jar
文件放在项目 lib
目录中的方法存在缺陷。
它有缺陷的原因是:
- JavaFX 还包含 native 库,因此您也需要包含它们(在
jfxrt.jar
能够找到它们的位置)。 - JavaFX 的给定版本将仅被认证为可针对其随附的 JDK 版本运行,因此您放置在项目的
lib
目录中的 JavaFX 运行时可能不适用于更高版本的 JDK版本,例如 JDK 8。 - JDK 8 等 JDK 的 future 版本将在 JDK 的默认类路径中包含 JavaFX,因此您可能会与放置在
lib
目录中的版本发生冲突。
总而言之,JavaFX 应该被视为 Java 运行时系统的一部分,而不是项目库。
JavaFX 系统依赖示例
如果你必须使用 Java 7 而你又不想使用 JavaFX maven 插件,那么你可以采取不太推荐的方法:
- 将 jdk(不是您的项目
lib
目录)中的 JavaFX 库作为 maven system dependency 引用.
此示例仅为 Java 7 提供,Java 8 不需要(并且不会按原样工作)。Java 8 将 jfxrt.jar 放在 ${java.home}/lib/ext/jfxrt.jar ,它位于默认的 Java 运行时类路径上,因此与 Java 8 的系统依赖关系无关。
<dependency>
<groupId>javafx</groupId>
<artifactId>jfxrt</artifactId>
<version>${java.version}</version>
<scope>system</scope>
<systemPath>${java.home}/lib/jfxrt.jar</systemPath>
</dependency>
如果您使用这样的系统依赖项打包您的应用程序,那么您需要为您的用户编写一些执行指令,以便他们可以在 Java 7 上运行您的应用程序时将 jfxrt.jar 添加到运行时类路径中。这是不使用这种方法的一个很好的理由。
如果选择使用maven系统依赖方式,不妨也使用maven antrun plugin嵌入对 JavaFX ant tasks 的调用如 this sample .您可能还想使用 maven enforcer plugin确保您的应用程序至少是针对最低要求的 Java 版本构建的,其中包含您的应用程序工作所需的 JavaFX 版本。
关于java - 带有 JavaFX 的 Maven 项目(jar 文件位于 `lib` 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15278215/