Eclipse+MavenでJavaFXを使い、Eclipseからの実行と、実行可能jarの作成ができるまでの手順を記載する。
この手順で環境構築を行った例は以下。
https://github.com/tsyki/javafx-example
JavaFX用のEclipseプラグイン「e(fx)clipse」を入れる(任意)
マーケットプレイスからインストールする。
入れなくてもJavaFXのアプリの実行はできるが、入れておくとFXMLの編集がやりやすくなる。
例えば、FXMLで指定したIDに対応するプロパティがコントローラで定義されていない、といった場合に警告を出してくれる。
2021/9版のpleiadesにe(fx)clipse3.7を入れて動作することを確認済み
新規Mavenプロジェクトを作成
「シンプルなプロジェクトの作成」をONにして作成する
pom.xmlに以下を追加
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>17</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>17</version>
</dependency>
新規JavaFXプロジェクトを作成。作成されたファイルを上記Mavenプロジェクトにコピー
FXMLを使う想定なので、ウィザードの宣言的UIはFXMLにしておく。
これにより、Main.java
、SampleControler.java
、application.css
、Sample.fxml
の4ファイルが作成される。
JavaFXプロジェクトだと、上記fxml、cssファイルもjavaファイルと同ディレクトリに配置されるが、Mavenプロジェクトの場合、そうすると実行可能jarを作成する際にfxml、cssファイルがjarに含まれない。
このため、Mavenプロジェクトにコピーする際は、fxml、cssファイルはresources以下に配置する。
(開発時はFXMLと対応するコントローラは同ディレクトリにあった方がやりやすいのだが…)
mainを実行するクラスを新規に追加する
上記手順で作成されたMainクラスがmainを実装しているが、これを直接Eclipseから実行しようとすると、エラー: JavaFXランタイム・コンポーネントが不足しており、このアプリケーションの実行に必要です
のエラーが発生して実行できない。
これを避けるために、Mainクラスのmainを呼ぶだけのクラスを作成し、そこから実行するようにする。
参考:https://torutk.hatenablog.jp/entry/2018/12/01/215113
maven-assemblyプラグインを入れる
以下をpom.xmlに追加する。これによりmvn package
で実行可能jarが作成可能となる。
<build>
<plugins>
<!-- 実行可能jarファイル用のプラグイン -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<!-- TODO jarファイルの名前になるので適宜修正 -->
<finalName>javafx-example</finalName>
<descriptorRefs>
<!-- 依存するリソースをすべてjarに同梱する -->
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<!-- TODO mainを実行するクラスを指定 -->
<mainClass>jp.gr.java_conf.tsyki.javafx.EntryPoint</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<!-- idタグは任意の文字列であれば何でもよい -->
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>