使用JavaFX的Maven项目(在`lib`中使用jar文件)

时间:2013-03-07 17:50:14

标签: java maven javafx

我正在设置一个maven项目,即将使用JavaFX。由于我听说JavaFX没有附带所有版本的Java,我下载并将jfxrt.jar文件放在我项目的lib目录中。

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

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

1 个答案:

答案 0 :(得分:65)

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>

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

建议的方法

使用Maven构建JavaFX应用程序:

  1. org.openjfx maven JavaFX plugin与Java 8和9 AND / OR
  2. 一起使用
  3. 使用Java 8或9,不要为JavaFX OR指定任何类型的Maven依赖项
  4. maven system dependency与Java 11 +一起使用。
  5. 与Java 7不同,使用Java 8时,不必将JavaFX设置为maven依赖项,因为JavaFX位于标准的Java运行时类路径上(类似于今天的Swing方式)。

    <强>意见

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

    它有缺陷的原因是:

    1. JavaFX还包括本机库,因此您也需要包含它们(在jfxrt.jar能够找到它们的位置)。
    2. JavaFX的给定版本将仅被认证为针对其随附的JDK版本进行操作,因此您放置在项目的lib目录中的JavaFX运行时可能不适用于以后的JDK版本,例如作为JDK 8。
    3. JDK的未来版本(如JDK 8)将在JDK的默认类路径中包含JavaFX,因此您可能会与放在lib目录中的版本发生冲突。
    4. 总之,JavaFX应该被视为Java运行时系统的一部分,而不是项目库。

      JavaFX系统依赖关系示例

      如果您必须使用Java 7并且不想使用JavaFX maven插件,那么您可以采用不太推荐的方法:

      • 将jdk(而非项目lib目录)中的JavaFX库引用为antrun plugin

      此示例仅针对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 JavaFX ant tasks将调用嵌入到this sample maven enforcer plugin中。您可能还希望使用{{3}}来确保您的应用程序至少针对包含应用程序所需的JavaFX版本的Java所需的最低版本构建。