JavaFXを使用するMavenプロジェクトを設定しています。JavaFXにはすべてのバージョンのJavaが付属しているわけではないと聞いたので、jfxrt.jar
ファイルをダウンロードlib
してプロジェクトのディレクトリに配置しました。
1)依存関係(つまり、JavaFX)をダウンロードしないように指定するにはどうすればよいlib
ですか?
2)これは、プロジェクトがJDKを備えた任意のマシンでビルドできることを意味しますか(JDK 1.7-update 9+は必要ありません)?
最近の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アプリを構築する場合:
Java 7とは異なり、Java 8ではJavaFXをMaven依存関係として設定する必要はありません。これは、JavaFXが標準のJavaランタイムクラスパス上にあるためです(現在のSwingと同様)。
意見
jfxrt.jar
ファイルをプロジェクトlib
ディレクトリに配置するというあなたの質問のアプローチには欠陥があると思います。
欠陥がある理由は次のとおりです。
jfxrt.jar
を見つけることができる場所に)。lib
ディレクトリに配置するJavaFXランタイムは、JDK8などの新しいバージョンのJDKに対しては動作しない場合があります。lib
ディレクトリに配置したバージョンと競合する可能性があります。要約すると、JavaFXは、プロジェクトライブラリとしてではなく、Javaランタイムシステムの一部として扱う必要があります。
JavaFXシステム依存関係のサンプル
Java 7を使用する必要があり、JavaFX 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に対してアプリケーションが構築されていることを確認することもできます。