とにかく書く

日々の雑感や知り得たことを、とにかく書いています

Arch Linux で OpenJDK と OpenJFX を使う(Java 15)

Arch LinuxEclipse を使って、Java FX でウィンドウを出すまでのメモ。地味に苦労した。
ポイントは

  • Open JFX を pacman でインストールしない
    • Open JFX のファイルも /usr/lib/jvm/java-15-openjdk/lib に展開されてしまう
    • --module-path /usr/lib/jvm/java-15-openjdk/lib を実行オプションに追加すると、jrt-fs.jar が java.base と衝突してしまい実行できない

  • Java FX についてよく知らないうちは Eclipse のプロジェクト作成時に JavaFX Project を選択しない
    • JavaFX Project は、Declarative UI でどの言語を選んでも初期作成ファイルが不完全な状態である(たぶん…)
    • そのため、実行時に java.lang.reflect.InvocationTargetException が発生して実行できない


実行までの流れ

  • Java SDK のインストール(Arch Linux は Open JDK しかサポートしていないとのこと)
# pacman -S jdk-openjdk
  • Java FX のインストール
Open JFX のウェブサイトから SDK をダウンロードして解凍する。
    • Oracle のウェブサイトにて、 Java 11 から Java FX は Open JFX を使うようにとのこと。
    • Pacman の Open JFX だと、Open JDK と同じディレクトリにファイルをコピーしてしまうため、 --module-path で当該ディレクトリを指定すると、jrt-fs.jar と java.base とで競合が起きる
      • module-info.java を使えば問題ないのかもしれないが、まだ理解できていない
Eclipse のインストール
  • Eclipse は AUR からインストールする
$ git clone https://aur.archlinux.org/eclipse.git
$ cd eclipse
$ makepkg -si
eclipse-java と eclipse-jee が衝突した
$ pacman -U eclipse-java-2:4.18-2-x86_64.pkg.tar.zst
  • e(fx)clipse プラグインは後回し(本記事では書かない)
    • Visual Studio のように、GUI 部品をマウスで配置するツールとして Scene Builder がある。
    • Scene Builder を Eclipse で使うためには、e(fx)clipse プラグインを入れる必要がある。
    • そのために Eclipse - ArchWiki にかかれているアップデートサイトの追加が必要
Eclipse でプロジェクトの作成
  • Create a project > JavaFX Project を選択する
  • JRE は、 Configure JREs を選択し、Add > Standard VM > Add External JARs で /usr/lib/jvm/java-15-openjdk/lib を選択する
  • リストが表示されるので、 java-15-openjdk を選択する
  • Declarative UI の Language は None のままにする
Open JFX の登録と実行
  • Open JFX ライブラリをプロジェクトに追加する
    • モジュール名を右クリック > Build Pass > Add Libraries にて User Libraryを選択する
    • 右側の New を選択して、ライブラリ名(たとえば JavaFX)を登録する。
    • 登録したライブラリ名をクリックして、 Add External JARs を選択する
    • Open JFX の jar ファイルを選択し、OKを押す
    • 登録されたライブラリを選択し、Finish を押す。
  • Open JFX を VM に登録する
    • Package Explorer のプロジェクト名を右クリック
    • Java Application / Main などで、Arguments タブに以下を入力する
--module-path /home/chrono/javafx-sdk-15.0.1/lib
--add-modules javafx.controls
  • RUNボタンを押す

ウィンドウが表示されれば成功!

こんなこともあった

  • --module-path などの後ろに = (イコール)を付けた
  • Create a project にて Java FX を選択し、Declarative UI の Lanugage を FXML にした
    • fxml を作成しなければ実行時に java.lang.reflect.InvocationTargetException が出る

今更?Java な個人的背景

Rust は GUI 周りがまだ貧弱なようなので、Java で画像ビューアーを作って、Windows でも活用できるようにしたいと思った。
Java はまだバージョンが1.XXのころに使ったことがある程度。
ビルドシステムも Makefile だとタブが見えないし…と Ant があるよ!という知識のまま止まっていた。

当時はまだ JIT コンパイラもなく、Java といえば「重たい」言語というイメージだった。
Eclipse なんてノートPCだとカクカクだった。

でも、JavascriptJava は違う!(Java のようなポインタも無くてライブラリ、ドキュメントが充実した素晴らしい言語に Javascript を比較するなんて!)という時代。
Ajax や、それを使った Google Map が出るまでは、Javascript とか学んだってしょうがないよ、時代は Java だよといった黄金時代だった。
Swing で GUI が簡単に実装できたときは感動したものだった。