首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >包含JavaFX的Maven项目(包含`lib`中的jar文件)

包含JavaFX的Maven项目(包含`lib`中的jar文件)
EN

Stack Overflow用户
提问于 2013-03-08 01:50:14
回答 1查看 52.3K关注 0票数 48

我正在设置一个maven项目,它将使用JavaFX。因为我听说JavaFX并不是所有版本的Java都附带的,所以我下载了jfxrt.jar文件,并将其放在项目的lib目录中。

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

2)这是否意味着项目可以在任何使用JDK (而不是JDK1.7-更新9+)的机器上构建?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-08 07:36:11

针对最新JavaFX版本的2019更新

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

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

本教程推荐使用OpenJFX JavaFX Maven Plugin,并为"hello,world“风格的应用程序提供了以下示例maven pom.xml项目文件。

代码语言:javascript
复制
<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与用于Java8和9的com.zenjava JavaFX maven plugin不同,因此请使用适合您的Java版本的and。

建议的方法

要使用Maven构建JavaFX应用程序:

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

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

Opinion

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

它有缺陷的原因是:

  1. JavaFX还包括本机库,因此您也需要将它们包含在内(位于jfxrt.jar能够找到它们的位置)。
  2. 给定的JavaFX版本将仅被认证为可在其附带的JDK版本上运行,因此您放置在项目的JavaFX目录中的lib运行时可能不能在较新的JDK版本上运行,例如JDK 8。
  3. 未来版本的JDK将在JDK的默认类路径中包含JavaFX。因此,您可能会与放置在lib目录中的版本发生冲突。

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

JavaFX系统依赖项示例

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

作为maven system dependency.,

  • 引用jdk (而不是您的项目lib目录)中的JavaFX库

此示例仅为Java7提供,对于Java8不是必需的(也不会按原样工作)。Java8将jfxrt.jar放在${java.home}/lib/ext/jfxrt.jar中,该位置位于缺省的Java运行时类路径上,从而使Java8的系统依赖项变得无关紧要。

代码语言:javascript
复制
<dependency>
  <groupId>javafx</groupId>
  <artifactId>jfxrt</artifactId>
  <version>${java.version}</version>
  <scope>system</scope>
  <systemPath>${java.home}/lib/jfxrt.jar</systemPath>
</dependency>

如果您使用这样的系统依赖项来打包您的应用程序,那么您将需要为您的用户编写一些执行指令,以便当在Java7上运行您的应用程序时,他们可以将jfxrt.jar添加到运行时类路径中。这是不使用这种方法的一个非常好的理由。

如果您选择使用maven系统依赖方法,您可能还希望使用maven antrun plugin来嵌入对JavaFX ant tasks的调用,就像在this sample中一样。您可能还希望使用maven enforcer plugin来确保您的应用程序至少是在包含应用程序工作所需的JavaFX版本的最低版本上构建的。

票数 76
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15278215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档