web-dev-qa-db-ja.com

JavaFXを使用したMavenプロジェクト( `lib`のjarファイルを使用)

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

1)依存関係(JavaFXなど)をダウンロードしないように指定する方法はありますが、どちらがlibにありますか?

2)これは、JDKを搭載した任意のマシンでプロジェクトをビルドできることを意味します(JDK 1.7の必要なし-アップデート9以降)。

42
One Two Three

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プラグイン は、 com.zenjava JavaFX mavenプラグイン とは異なることに注意してください。 Java 8および9に使用されるため、Javaバージョンに適切なものを使用します。

推奨アプローチ

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

  1. Java 8および9 AND/ORとともに com.zenjava maven JavaFXプラグイン を使用します
  2. Java 8または9を使用し、JavaFXのMaven依存関係の種類を指定しないOR
  3. Java 11+で org.openjfx maven JavaFXプラグイン を使用します。

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

オピニオン

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

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

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

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

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

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

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

このサンプルはJava 7のみに提供され、Java 8には必要ありません(そのままでは機能しません)Java 8、jfxrt.jarを配置しますデフォルトのJavaランタイムクラスパスにある$ {Java.home} /lib/ext/jfxrt.jarにあり、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タスク への呼び出しをin this samplemavenエンフォーサプラグイン を使用して、アプリケーションに必要なJavaFXバージョンを含むJavaの少なくとも必要なバージョンに対してビルドされるようにすることもできます。働く。

65
jewelsea