EclipseからSwingアプリを起動すると、フォント構成ファイルの情報が無視される

こうなる。

  • コマンドラインから起動 (先日作成したフォント構成ファイルを使っている)
  • Eclipseの「実行」メニューから起動 (フォント構成ファイルが無視されている上に「。」が変な位置に表示されている)

解析してみる (未完)

原因不明につき、現在解析中。とりあえず調査してみたこと。

  • どの環境から起動するとおかしくなるのか。
    • 件のJavaプログラムを起動するだけの実行ファイルを用意して、Eclipseから実行。⇒ 問題なし。よって、環境変数などの影響は受けてなさそう。
    • antのターゲットにタグを使用し、antビルドの機能で件のJavaプログラムを起動。⇒ 同上。
    • Eclipseでの「実行」⇒ 前述の通りの症状。原因が読めないorz
  • フォント構成ファイルが正しく読み込めているか。rt.jarをひっくり返したところ、FontConfigurationクラスのdumpメソッド*1を使えば読み込み結果をダンプできることがわかった。試してみたところ、確かに出力されたが、問題のあるケースとそうでないケースで違いが確認できなかった。⇒ フォント構成ファイルの読み込みは問題ないらしい。
  • 仕方がないのでFontクラスから追跡中。(←いまココ)
    jadで解析するのはめんどい……と思いつつぐぐってたら、あるじゃねーか、OpenJDKのソースが。というわけで両方参照して調査中。

調査の副産物

  • プロパティsun.awt.fontconfig: フォント構成ファイルを指定する。直接Fileクラスのコンストラクタに叩き込まれている。
  • プロパティjava.util.logging.config.file: ログの設定ファイルを指定する。同じくFileクラスのコンストラクタ行き。
    • プロパティsun.java2d.debugfonts: フォント関連のログメッセージを出力する。「true」(と言うより「false」以外)を指定して、次のログの出力レベルを適切に設定すれば、フォント関連のログメッセージが出力される。(両方の設定が必要)
    • (ログ設定ファイルの設定値) sun.java2d.level: rt.jarに含まれているライブラリに埋め込まれたログ出力レベル。「sun.java2d.level = ALL」のように指定する。

*1:privateメソッドなので、リフレクションで突破