49

JavaFXを使用するMavenプロジェクトを設定しています。JavaFXにはすべてのバージョンのJavaが付属しているわけではないと聞いたので、jfxrt.jarファイルをダウンロードlibしてプロジェクトのディレクトリに配置しました。

1)依存関係(つまり、JavaFX)をダウンロードしないように指定するにはどうすればよいlibですか?

2)これは、プロジェクトがJDKを備えた任意のマシンでビルドできることを意味しますか(JDK 1.7-update 9+は必要ありません)?

4

1 に答える 1

76

最近のJavaFXバージョンの2019アップデート

Java 11以降、JavaFXはJDKから分離されているため、JavaFXライブラリはJDKインストールと自動的にバンドルされなくなりました(たとえば、Oracle JDK 8ディストリビューションの場合のように)。代わりに、JavaFXシステムは、JDKから独立した一連の個別のライブラリとして設計されており、アプリケーションで使用するためにMavenなどのツールによってリポジトリからダウンロードできます。

openjfx.ioには、MavenでJavaFX11+を使用するための非常に短いチュートリアルがあります。

このチュートリアルでは、OpenJFX JavaFX Mavenプラグインの使用を推奨し、「hello、world」スタイルのアプリケーション用に次のサンプルMavenpom.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>

Java11以降で使用されるorg.openjfxJavaFXmavenプラグインはJava8および9で使用されるcom.zenjavaJavaFXmavenプラグインとは異なるため、Javaバージョンに適切なプラグインを使用することに注意してください。

推奨されるアプローチ

Mavenを使用してJavaFXアプリを構築する場合:

  1. com.zenjavamavenJavaFXプラグインをJava8および9で使用するAND/OR
  2. Java 8または9を使用し、JavaFXにMavenの依存関係を指定しないまたは
  3. org.openjfxmavenJavaFXプラグインをJava11以降で使用します。

Java 7とは異なり、Java 8ではJavaFXをMaven依存関係として設定する必要はありません。これは、JavaFXが標準のJavaランタイムクラスパス上にあるためです(現在のSwingと同様)。

意見

jfxrt.jarファイルをプロジェクトlibディレクトリに配置するというあなたの質問のアプローチには欠陥があると思います。

欠陥がある理由は次のとおりです。

  1. JavaFXにはネイティブライブラリも含まれているため、それらも含める必要があります(それらjfxrt.jarを見つけることができる場所に)。
  2. 特定のバージョンのJavaFXは、同梱されているJDKのバージョンに対してのみ動作することが認定されているため、プロジェクトのlibディレクトリに配置するJavaFXランタイムは、JDK8などの新しいバージョンのJDKに対しては動作しない場合があります。
  3. JDK 8などのJDKの将来のバージョンでは、JDKのデフォルトのクラスパスにJavaFXが含まれるため、libディレクトリに配置したバージョンと競合する可能性があります。

要約すると、JavaFXは、プロジェクトライブラリとしてではなく、Javaランタイムシステムの一部として扱う必要があります。

JavaFXシステム依存関係のサンプル

Java 7を使用する必要があり、JavaFX mavenプラグインを使用したくない場合は、あまり推奨されないアプローチを取ることができます。

  • mavenシステムlibの依存関係として(プロジェクトディレクトリではなく)jdkからJavaFXライブラリを参照します。

このサンプルはJava7でのみ提供されており、Java 8では必要ありません(そのままでは機能しません)。Java8は、jfxrt.jarを${java.home}/lib/ext/jfxrt.jarに配置します。デフォルトのJavaランタイムクラスパスでは、Java8のシステム依存関係は無関係になります。

<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システム依存関係アプローチを使用することを選択した場合は、このサンプルのように、 mavenantrunプラグインを使用してJavaFXantタスクへの呼び出しを埋め込むこともできます。また、Mavenエンフォーサープラグインを使用して、アプリケーションが動作するために必要なJavaFXバージョンを含む少なくとも最低限必要なバージョンのJavaに対してアプリケーションが構築されていることを確認することもできます。

于 2013-03-07T23:36:11.133 に答える