java - 带有 JavaFX 的 Maven 项目(jar 文件位于 `lib` 中)

标签 java maven javafx

我正在建立一个 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 应用程序:

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

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

意见

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

它有缺陷的原因是:

  1. JavaFX 还包含 native 库,因此您也需要包含它们(在 jfxrt.jar 能够找到它们的位置)。
  2. JavaFX 的给定版本将仅被认证为可针对其随附的 JDK 版本运行,因此您放置在项目的 lib 目录中的 JavaFX 运行时可能不适用于更高版本的 JDK版本,例如 JDK 8。
  3. JDK 8 等 JDK 的 future 版本将在 JDK 的默认类路径中包含 JavaFX,因此您可能会与放置在 lib 目录中的版本发生冲突。

总而言之,JavaFX 应该被视为 Java 运行时系统的一部分,而不是项目库。

JavaFX 系统依赖示例

如果你必须使用 Java 7 而你又不想使用 JavaFX maven 插件,那么你可以采取不太推荐的方法:

此示例仅为 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/

相关文章:

java - Axis2 不返回自己的对象

java - 使用和不使用 Maven 插件为 Maven 项目构建 jar 的区别

java - 如何在 Javafx 中使用 Arraylist 填充表列

css - 如何在 JavaFx 的组合/选择框中为特定元素添加自定义 css 样式?

javafx - 如何在 JavaFX 2.1 中创建模式窗口

java - 开始部署应用程序时,嵌入式 Tomcat 挂起

java - JDBC 中的PreparedStatement : value inserting

java - apache ant 可变文件类型属性

java.lang.ClassFormat错误: Invalid code attribute name index 0

maven: war:war 即使内容不变也会重建 war - 为什么?