日記というよりは過去を振り返るときのための単なる備忘録この広告は、90日以上更新していないブログに表示しています。OpenJFX11で試したバージョンに差し替え要旨Java11から、JavaFXは分離されるので、Java11(OpenJDK11)でJavaFXを使うにはどうしたらよいのか?結論としては、以下の2点だけ注意すればよさそう。Repositoryに公開済みなので、pomの依存ライブラリとして書いておけばよい。ようにjavaを起動する。今回の実験コード一式はGitHubにあります。github.com実験コードWindows上のOpenJDK11(11+28)で、以下のようなJavaFXの簡単なコードで試す。FXMLLoaderはリフレクションによって、このクラスのプライベートフィールドに書き込む。そのためにはmodule-infoでopensしておく必要がある。タイトルにモジュール名/クラス名を表示する。無名クラス(クラスパス指定による起動)の場合はモジュール名はnullとなる。jp.seraphyware.example;}モジュール名は「javamoduleexample」としている。より、FXMLLoaderがコントローラクラスにリフレクション経由でアクセスできるようにしている。(@FXMLの部分)Mavenでのビルドビルド時にはOpenJDK11にパスを通しておくこと。(JavaFXまわりのライブラリはMavenでダウンロードされるので、OpenJFXのSDKなどは入れておく必要はない。MEANIFESTによるメインクラスの指定は意味ないかも。展開されたjavafxの依存jarのうち、-win.jar以外のものを消す。ないので、ファイル名から自動モジュール名がつけられるが、これがよろしくない。xxxEmptyという、別名となるモジュール名が割り当てられ衝突しなくなったので不要となった。付与することができないので、java9以降のjarコマンドを直接使用して属性を更新させる。してモジュール名を指定してモジュールのメインクラスを実行することができる。Mavenからモジュールとして実行できるようにする。指定はいらないようだ。exec:execこのようにすると、ビルドして、実際にJavaFXのアプリケーションを起動してくれる。以降の機能を使って、モジュールを指定して起動させている。コマンドを実行すると、以下のファイルができる。いう名前がつけられている。いう名前が付けられている。ないものは、中身が空で、いらないものである。正式版でなかった時は、モジュール名の衝突問題があったため、この不用な空のjarは削除する必要があったが、正式版では空のjarにはMANIFEST.MF上で明示的に衝突しないxxxxEmptyというダミーのモジュール名を割り当てているため、削除しなくても問題ない。(しかし、無意味なjarであるので消したほうが良いとは思われる。)なお、最後の「javamoduleexample-1.0-SNAPSHOT.jar」は、このサンプルのモジュールjarである。javaコマンドからの実行Javaコマンドでモジュールとして扱うには以下のようにする。javamoduleexample/jp.seraphyware.example.JavaModuleExampleウィンドウタイトルは「モジュール名/クラス名」を表示するようにしている。javamoduleexampleこのようにモジュール名を指定するだけでメインクラスを実行することができる。現時点ではソースコードや、Mavenのmaven-jar-plugin(3.1.0)からは、これらの属性は設定できない。コマンドによって付与する。コマンドを起動して直接書き換えることになる。--file=target\mods\javamoduleexample-1.0-SNAPSHOT.jarのようにして確認することができる。jlinkで配備用パッケージを作成してみるjlinkを使うことにより、使用しているモジュールだけに絞り込んだ配備用のJREを作成できる。そのときランチャ用のスクリプトも指定できる。run=javamoduleexample/jp.seraphyware.example.JavaModuleExampleモジュールパスを指定して、メインとなるモジュールを指定すれば、それが依存するモジュールに絞り込んだJREが作成される。することで、起動用のシェルも作成してくれる。(中身をみると、たいしたことはやってないのだが。)これでできあがった実行環境はrelease\bin\run.batのようにして起動できる。java.base/java.lang.Thread.run(Thread.java:834)のようなエラーがでる場合は、環境変数PATHの中で古いJavaFXを参照して、そのDLLが読み込まれている可能性がある。これを使うとEclipseまわりのパスが環境変数PATHに設定されるので不味いことになるようだ。)対策として、Java関連のPATHをないようにしてする。PATH=C:\Windows\system32;C:\Windowsrelease\bin\run.batのようなシンプルな最小限のパスにしてから起動してみると良いかもしれない。(2018/09/29追記)Pleiades-201809のJava11でJavaFXをEclipse上から実行する場合も、同様な理由で上記NoSuchMethodError例外が発生する。これは起動時のPATHに現在のEclipseが使っているパスが含まれているためである。「実行の構成」から「環境」タブで、環境変数PATHを書き換えてやると、うまく起動できるようになる。まとめMavenでJavaFXを普通のライブラリとしてビルドできるようにしてもらったおかげで、JavaFXアプリのOpenJDK11対応も、それほど不自由なくゆけそうな感じである。Java9以降のモジュール仕組みに不慣れであったため戸惑うところもあるが、これは本質とは、あまり関係ない。それほど案ずる必要はなかったという実感を得た。今回お世話になった数々のページ。Apps以上、メモ終了。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。