带有 JavaFX 的 Maven 项目(在 `lib` 中有 jar 文件)

Posted

技术标签:

【中文标题】带有 JavaFX 的 Maven 项目(在 `lib` 中有 jar 文件)【英文标题】:Maven project with JavaFX (with jar file in `lib`) 【发布时间】:2013-02-23 01:35:04 【问题描述】:

我正在建立一个 maven 项目,它将使用 JavaFX。由于我听说 JavaFX 并非所有版本的 Java 都附带,所以我下载了 jfxrt.jar 文件并将其放在我项目中的 lib 目录中。

1) 我如何指定不应该下载依赖项(即JavaFX),但它位于lib

2) 这是否意味着项目可以在任何带有 JDK 的机器上构建(并且不需要 JDK 1.7 - 更新 9+)?

【问题讨论】:

我有同样的问题,问题已损坏jfxrt.jar,我建议重新安装 Java 或快速修复替换 jfxrt.jar 与此 JavaFX 应用程序运行正常的那个。 【参考方案1】:

2019 最新 JavaFX 版本更新

从 Java 11 开始,JavaFX 已与 JDK 分离,因此 JavaFX 库不再自动与 JDK 安装捆绑在一起(例如在 Oracle JDK 8 发行版中)。取而代之的是,JavaFX 系统现在被设计为一组独立于 JDK 的独立库,可以通过 Maven 等工具从存储库中下载这些库以供您的应用程序使用。

openjfx.io 有一个关于在 Maven 中使用 JavaFX 11+ 的简短教程:

https://openjfx.io/openjfx-docs/#maven

本教程建议使用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>

请注意,用于 Java 11+ 的 org.openjfx JavaFX maven plugin 与用于 Java 8 和 9 的 com.zenjava JavaFX maven plugin 不同,因此请使用适合您的 Java 版本的com.zenjava JavaFX maven plugin。

建议的方法

使用 Maven 构建 JavaFX 应用程序:

    将com.zenjava maven JavaFX plugin 与 Java 8 和 9 AND/OR 结合使用 使用 Java 8 或 9,并且不要为 JavaFX 指定任何类型的 Maven 依赖项或 在 Java 11+ 中使用 org.openjfx maven JavaFX plugin。

与 Java 7 不同,在 Java 8 中没有必要将 JavaFX 设置为 maven 依赖项,因为 JavaFX 位于标准 Java 运行时类路径上(类似于今天的 Swing)。

意见

我认为您将jfxrt.jar 文件放在项目lib 目录中的方法存在缺陷。

它有缺陷的原因是:

    JavaFX 还包含本机库,因此您也需要包含它们(在jfxrt.jar 能够找到它们的位置)。 给定版本的 JavaFX 将仅被认证为针对其随附的 JDK 版本运行,因此您放置在项目的 lib 目录中的 JavaFX 运行时可能不适用于更高版本的 JDK,例如 JDK 8. JDK 的未来版本(例如 JDK 8)将在 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 版本。

【讨论】:

感谢您的回答。我想使用您提到的方法(即,指定jdk1.7.0_09 目录的本地路径,但我无法在我的雪豹上安装除jdk.1.7.0_u4 之外的任何更高版本的jdk。(我已经尝试了oracle网站,但安装程序只能在Mountain Lion上运行!)您是否知道如何在Snow Leopard上安装1.7.0_09版本?(因为这是支持JavaFX的最低Java版本,不是吗?吗?) 避免硬编码 lib 目录的路径/平台/版本依赖:&lt;systemPath&gt;$java.home/lib/jfxrt.jar&lt;/systemPath&gt; 不需要其他属性。 Java 8 将位置更改为 lib/ext &lt;systemPath&gt;$java.home/lib/ext/jfxrt.jar&lt;/systemPath&gt; 如果你不想使用Oracle的JDK发行版,有一个JavaFX distribution for Ubuntu based upon the the OpenJDK sources,或者你可以构建JavaFX for OpenJDK from source。 最近事情变得有点复杂,例如在 Ubuntu 18.04.2 LTS 上。您现在需要专门安装合适的 JavaFX - 默认值可能无法为您提供所需的里程。见***.com/questions/56166267/…

以上是关于带有 JavaFX 的 Maven 项目(在 `lib` 中有 jar 文件)的主要内容,如果未能解决你的问题,请参考以下文章

Javafx 项目不能用 maven 编译

如何在 IntelliJ IDEA 中创建 JavaFX Maven 项目?

创建基于maven的javaFX项目

使用 maven 部署 javafx hsqldb 项目

IntelliJ Maven 和 JavaFX

JavaFX Maven 插件:在当前项目和插件组中找不到前缀“jfx”的插件