JavaFXアプリケーションのプロセスが終了せずに残ってしまう

JavaFX アプリケーションに二重起動を防止する仕組みを追加したところ プロセスが終了せずに残ってしまうようになってしまいました。

これは Windows 環境の Java 11 + OpenJFX 11 で発生した事象です。他のプラットフォーム OpenJFX のバージョンによっては問題が起こらない可能性もあります。
バッチファイルで使えるショートカット作成コマンド

実行ファイルへのショートカットをバッチファイルから作成する方法を紹介します。

ショートカットを作成する機能は ShellLink オブジェクトによって提供されています。ShellLink オブジェクトは Windows Scripting Host WSH からも呼び出せるので VBScript VBS JScript でショートカット作成コマンドを実装することもできるのですが 今回は C++を使って実行ファイル EXE としてショートカット作成コマンドを実装してみました。

EclipseからIntelliJ IDEAに乗り換えた話

私はこれまで Java の開発に Eclipse を使ってきました。Eclipse にコードネームとして星の名前が付くよりも前 たしか Eclipse 2.1 からだったでしょうか。かれこれ 15 年以上 Eclipse を使い続けてきました。

長年 Eclipse を愛用してきた私が JetBrains IntelliJ IDEA に乗り換えました。これまで私は IntelliJ IDEA のことを勘違いしていて IntelliJ IDEA は商業主義的だと否定的に捉えていました。しかし これは大きな勘違いでした。JetBrains はオープンソース開発コミュニティーに対してとても寛容で オープンソース開発を支える存在でもあったのです。

そのことについてお話しましょう。

JavaFXの例外処理ベストプラクティス

例外をむやみにキャッチして握り潰してはいけない これはよく知られている鉄則です。自ら対処できないのであれば 例外をキャッチせずに上位にそのまま伝搬させるのが良い設計であるとされています。

例外を握り潰してしまっている例
public void myBusinessLogic() { try { doSomething(); } catch(IOException e) { e.printStackTrace(); } }

この鉄則は広く浸透しており 上記のようなコードを書いている人はもういません。多くの開発者は 処理できない例外をそのまま伝搬させるコードを書きます。

例外をキャッチせずにそのまま上位に伝搬させる例
public void myBusinessLogic() throws IOException { doSomething(); }

この鉄則は 呼び出される側のコード について言及したものです。呼び出される側のライブラリならそれで十分でしょう。しかし 伝搬していった例外はいつか誰かがキャッチしなければなりません。その役回りは ほとんどの場合 アプリケーションが務めることになります。

ライブラリでは投げっぱなしにできた例外も アプリケーションではそうはいきません。投げっぱなしにされた例外をアプリケーションはどのようにハンドリングすれば良いのでしょうか?

JavaFX を例にアプリケーションでの例外処理を解説します。

SVNチェックアウトで E120104 エラーが発生したときの対処方法

先日 某社内ネットワークからインターネット上にある Subversion リポジトリのチェックアウトを試みたところ下記のエラーが発生してしまいました。サーバーは Subversion 1.9.5 クライアントは Subversion 1.12.2 でした

svn: E120104: ra_serf: An error occurred during decompression

エラーメッセージに含まれる ra_serf というのは Subversion で使われている HTTP クライアントライブラリです。この HTTP クライアントライブラリが Subversion サーバーから転送されてきた圧縮データを展開するときにエラーが発生したということです。

ウェブで ra_serf を検索してみると 上記のエラーのほか E120106: ra_serf: The server sent a truncated HTTP response body. が発生したという報告も多数見つかります。

Javaはカレントディレクトリを使わない

Java 11 から user.dir システムプロパティを実行時に変更することができなくなりました。この変更によって 相対パスを解決する開始点を実行時に変更している一部のアプリケーションが影響を受けます。

user.dir システムプロパティとカレントディレクトリの関係について説明します。

IntelliJ IDEAでGradleプロジェクトの実行がエラーになる!?

Eclipse で開発していた JavaFX アプリケーション Gradle プロジェクト形式 がありました。この Gradle プロジェクトを IntelliJ IDEA にインポートして実行すると IllegalStateException: Location is not set. というエラーが発生してアプリケーションの起動に失敗してしまいました。Eclipse では実行できていたのになぜ?

その原因は Eclipse IntelliJ IDEA のリソースの扱いの違いにありました。Gradle プロジェクトでリソースをどこに配置するのがよいか紹介したいと思います。

書式化したまま編集できるテキストフィールドを作る(JavaFX)

先日 インターネットバンキングで振込操作をしたのですが ユーザーインターフェースの出来があまり良くないと感じました。振込金額の欄に 3 桁区切りのカンマが表示されず 100 万円を振り込むために 1000000 と入力する必要があったのです。

 いち じゅう ひゃく せん まん

画面の数字を 1 桁ずつ指差しながら数えて金額に間違いがないことを確認しました。一応 確認画面に進むとカンマ付きで 1,000,000円 と表示されたのですが 画面遷移するまで書式化された表示にならないのってユーザビリティとしてどうなの?

他所様のシステムに文句を言いたいわけじゃないんです。自分も同じような実装をしてきたなあと反省してしまったのです。画面遷移するまで書式化されないというほど酷くはなかったのですが…

jlinkで他プラットフォームのJREを作成する(クロス・ターゲット)

以前の記事 JRE が単体で配布されなくなった理由 では Java アプリケーションに軽量化した JRE をバンドルする配布方式について紹介しました。

従来のシステムワイドに Java をインストールする方法では 一部のアプリケーションの都合で Java のバージョンを据え置かなければならない状況を生むことがありました。1 つのアプリケーションが新しいバージョンの Java で動作検証されていない たったそれだけの理由で古い Java が使われ続けるなんてこともあったのです。古いバージョンの Java がシステムに居座り続けていると 当然 悪循環に陥ります。

 すでに Java 5 がインストールされているから新規アプリも Java 5 で作ってね!

もうこれ一生抜け出せないパターンじゃないですか…。

JavaFXアプリケーション開発にはLiberica JDKがオススメ

私はこれまで JavaFX アプリケーションの開発に Oracle OpenJDK Gluon JavaFX の組み合わせを使ってきました。JDK OpenJFX をマージするバッチファイルを作ったりもしました。

でも そんな手間を掛ける必要はなかったんです。はじめから OpenJFX がバンドルされている OpenJDK ディストリビューションを使えば済む話だったのです。OpenJFX をバンドルしている OpenJDK それが Liberica JDK です。