ひらおかゆみのなげやりブログ

もう、なげやりです…

Java 8で作成したJavaFXアプリケーションをJava 9で動かす

このエントリは、JavaFX Advent Calendar 2017 の 4 日目です。昨日は @boochnich さんの「JavaFXとHiDPI」、明日は今のところ未定です。

昨年はわたしの誕生日枠で JavaFX の 3D 機能を使って小惑星のビューワを作成しました。

 

blog.yumix.net

 

今回はこのビューワをJava 9に対応させる方法について調べてみました。

方法1: Java 8 で作成したアプリケーションをそのまま動かす

javacの -source と -target がともに 1.8 (または 8) の場合、特に変更することはありません。互換性は維持されていますのでご安心を。JDK 9の新機能を利用できないデメリットはありますが、とりあえず何もしなくても動作するのはお手軽です。なお、JDK 8は -source / -target に 1.8 と 8 のどちらかでも指定できるようになっていますが、JDK 9 では 1.9 は指定できず 9 のみ使用できます。

方法2: Java 9 のモジュール機能を使用してプロジェクトを修正する

本来はこちらの方法が推奨なのでしょう。まずは、ソースファイルのレイアウトからご覧ください。

f:id:yumix_h:20171203025621p:plain

Java 8 までとの相違点は以下の通りです。

  • src ディレクトリ以下にパッケージをまとめるディレクトリ(この例ではasteroid)を作成する。Eclipseではパッケージ扱いされるのでなんかキモい。
  • 上記のフォルダにJavaのソースファイル等とmodule-info.javaファイルを格納する。

Eclipse Oxygen 1a組み込みのMavenはバージョンが古いのか、挙動不審な点が多々見られました。最新版のMavenをセットアップして、そちらを使うように設定したほうがよさそうです。

訂正:Eclipse 4.7.1aでは、Maven形式のプロジェクトではJava 9のJigsawは使えないようです。EclipseのJavaプロジェクトで作成して正常に動いたプログラムをMaven形式に変換した途端にjava.lang.module.FindExceptionで動作しなくなったので、原因はMavenにあるとみて間違いなさそうです。MavenというツールそのものがJava 9のJigsawに対応できていないのか、それともEclipseのMaven周りの問題なのかは、今のところ不明です。

さて、問題なのは module-info.java をどう書けばよいかです。Jigsawのメリットとして使わないモジュールを除外できるというのがあります(特にjavapackagerでネイティブ版を作成したときは効果大です)。でも、JDK 9のドキュメントにはモジュール間の依存関係は書いてあるのですが、JDK 8までのように「とりあえず全部」が難しくなっています。

JDK 9では何もしないとjava.baseというモジュールが使えます。残念ながらその中にJavaFXのモジュールは含まれていません。そこで、module-info.javaにJavaFXのモジュールを取り込むように設定する必要があります(そのため、JDK 9ではファイルのレイアウトが変わります)。

JavaFXのモジュール依存関係を見てみると、javafx.baseを起点としていくつかのスーパーセットが定義されています。そして一番広範囲に API をカバーしているモジュールは、javafx.fxml、javafx.media、javafx.web、javafx.swingの4種類です。つまりこの4モジュールを取り込めば、JDK 8とほぼ同じ範囲の API が使えるようになります。

とりあえず動けばいいや、と思う方は以下のように module-info.java を記述すればたぶん大丈夫です。

module asteroid {
    requires javafx.web;
requires javafx.fxml;
requires javafx.media;
requires javafx.swing;

モジュール名は、モジュールをまとめるディレクトリ名(今回の例ではasteroid)と一致するようにすればOK。 

モジュールについて感覚がつかめてきたら、取り込むモジュールをもっと範囲の狭いもの(javafx.controlsなど)に絞り、使わないものは除外すると、特にjavapackagerでJDKと一緒にパッケージしたときサイズが小さくなります。

結論: Eclipseの場合、普通のJavaプロジェクト(Maven形式でない)に限り、Java 9で動作させることができるようです。

JavaFX Advent Calendar 2017、もうすぐ始まります

わたしが毎年参加させていただいていた "JavaFX Advent Calendar"、今年はどなたも主宰される様子がなかったので、僭越ながらわたしが主催します。今までの感謝の気持ちが先走って、肝心のネタがまだ見つかっていないのですが。

皆さんぜひ、参加してみてください。

qiita.com

※ただし、平田あづみ(id:planet-az)は義務なのでよろしく。

※あと、@btnrouge (a.k.a. @khasunuma) はさっさと参加表明しなさい。

2017年8月の部分月食

こんばんは。

 

8月8日の午前2時過ぎから4時過ぎにかけて、全国的に部分月食が見られるようです。当日は曇りの予報(東京)で天気がちょっと心配ですが、コンディションが良ければ南西の空で徐々にかけてゆく月の姿が見られるでしょう。

www.nao.ac.jp

 

今月は流星群(ペルセウス座流星群)も見られます。夜空を見上げるのが楽しみになりますね。

 

Surface Pro 3、再び

こんばんは。

 

わたしの手元に、再びSurface Pro 3がやってきました。

頂き物です。というか、補償です。

中古で、電源コネクタのところにやっちゃった感丸出しの大きな傷はありますが、今のところ問題なく動いています。

 

最初に電源入れたとき、Windows 8.1の懐かしい画面が出てきたので、Microsoftアカウントの設定だけ済ませてすぐにWindows 10へとアップグレードしたのですが、どこかでライセンス認証すると言われるかと思いきや、最後まで何も言われなかったです。前の持ち主が一度アップグレードしたか、もしくはわたしが以前のSurface Pro 3でWindows 10へアップグレードした記録がMicrosoftアカウントに存在したのか、定かではありませんが、結果オーライということで。

 

 

実はOfficeがついていないのですが、ブラウザのOffice OnlineやGoogle Docsで事足りそうだし、Windows Inkとかで十分遊べそうだから、しばらくはこのままでいいかなとも思っています。

 

ではまた。

Google Domains

お久しぶりです。

 

唐突ですけど、Googleがドメインの取り扱いまで始めたようです。

domains.google.com

 

何だか面白そうなので、"yumix.net"を移管させて…いる途中です。

ここには10~20分で終わると書いてあったのに、もう30分以上待たされています。

お名前.comから応答がないっぽい。お名前.comの移管状況確認見ても何にも載っていないし、ちゃんと移管できるの? →1時間くらい経ったら移管始まった。よかった

 

Payara ServerのLog Viewerについて

このエントリは、Payara Advent Calendar 2016の24日目です。昨日は@n_agetsuさんの「PayaraのJMX Monitoring Service」でした。明日は@khasunumaです。

1. はじめに

このアドベントカレンダーをご覧の方はご存じのはずですが、Payara ServerにはWebインタフェースのAdmin Consoleが付いています。Payara Serverの操作を一通り行える優れものですが、その中にはLog Viewerという興味深い機能があります。文字通り、ログを見るための機能です。

2. Log Viewerの使い方

操作は簡単で、まず左側の「server (Admin Server)」をクリックして「General Information」を表示します。

f:id:yumix_h:20161211233037p:plain

サーバのステータスの上にいくつかボタンがありますが、その中の「View Log Files」をクリックします。これでLog Viewerが開きます。

f:id:yumix_h:20161211233500p:plain

Log Level、Recordの先頭と最後、タイムスタンプなどでの絞り込みができます。詳細は一覧のMessageのところにある「(details)」というリンクをクリックすると見ることができます。ここではRecord Number 51(つまり一番上)の詳細を表示してみます。

f:id:yumix_h:20161211233741p:plain

Log Viewerには「Advanced Search」という機能があり、さらに細かな条件でログを検索することができます。以下のスクリーンショットから、どれだけ細かく検索オプションを指定できるのかがわかります。

f:id:yumix_h:20161211234007p:plain

Log Viewerの関連機能として、ログをそのまま表示するRaw Log Viewer、ログの強制ローテートなどがあります。「Domain」の「Domain Logs」タブで「Collect Logs」ボタンをクリックするとログをダウンロードすることも可能です。

3. まとめ

Windowsにはgrepsedawkも入っていないので、ログの検索が可能なLog Viewerは心強い味方となることでしょう。また、サーバマシンにsshで直接ログインできない環境であっても、Admin Consoleさえ使えれば、Log Viewerでログの解析もできますし、ログを差し押さえたければダウンロードすればOKです。

もし、皆さんのPayara ServerがAdmin Consoleにログインできるのであれば、ログに関する操作はすべてAdmin Consoleだけで行えます。Windows環境でPayara Serverを使用している方、リモート接続が制限されている環境でPayara Serverを使用せざるを得ない方にとっては、Log Viewerは非常に強力なツールだと思います。ぜひ、お試しください。

4. 制限事項

server-config → Logger Segins  Log File Logging Format でログ・ファイルの出力形式 (デフォルトでは ODL) を JSON に変更すると、JSON ログLog Viewerでは表示できません。

f:id:yumix_h:20161212001752p:plain

参考まで、ログ出力形式をJSONに設定すると、JSONで出力されたログはLog Viewerでは表示できません。

f:id:yumix_h:20161212001810p:plain

仕様なのか、バグなのかは私では判断なかったので、とりあえずバグかも?ということで事象を報告しました。 

github.com

@khasunumaが何の前触れもなく付けてきたコメントをまとめると、

  • ソースコードから判断する限り、バグではなく制限事項と考えられるため、これは改善要望とすべき
  • PayaraのログにはULF形式とODF形式以外に「カスタム・フォーマッタ」が使用でき、JSON形式は現時点ではカスタム・フォーマッタ扱い
  • Log Viewerはカスタム・フォーマッタには対応しておらず、そのためJSON形式のログは表示することができない
  • 現状、Admin ConsoleでJSON形式のログを表示するなら、Log ViewerではなくRaw Log Viewerの方を使った方がいい

だそうです(分かるような、分からないような…)。さらにPayaraのMike Croft (@croft) さんからは、この件は改善要望として取り上げるとのコメントをいただきました。