FessのJUnitテスト実行時に、X Window(ディスプレイ)にアクセスしようとしてテストが失敗するケースがありました。CI/CD環境やDockerコンテナなど、GUIのない環境でも安定してテストを実行できるよう、headlessモードを有効化する設定を追加しました。
問題の背景
Javaアプリケーションでは、AWTやSwingなどのGUIコンポーネントを使用するコードがあると、テスト実行時にディスプレイ環境へのアクセスが発生することがあります。以下のような環境では、X11サーバーが存在しないためテストが失敗します。
- CI/CDパイプライン(GitHub Actions、Jenkinsなど)
- Dockerコンテナ
- X11転送なしのSSH接続先サーバー
変更内容
pom.xmlのテストプロファイル設定で、JVMの起動引数に-Djava.awt.headless=trueを追加しました。
<test.command.args>--illegal-access=permit -Djava.awt.headless=true</test.command.args>
この設定により、テスト実行時にJavaがheadlessモードで動作し、ディスプレイなしの環境でもAWT関連の処理が正常に動作するようになります。
headlessモードとは
Javaのheadlessモードは、キーボード、ディスプレイ、マウスといった入出力デバイスがない環境でもJavaアプリケーションを動作させるための機能です。headlessモードでは、以下のような処理が可能です。
- フォントの読み込みとレンダリング
- 画像の生成・加工
- 印刷処理
一方で、ウィンドウの表示やユーザー入力の受付など、実際のディスプレイが必要な操作は利用できません。
まとめ
-Djava.awt.headless=trueオプションの追加により、Fessのテストがヘッドレス環境でも安定して実行できるようになりました。CI/CD環境でのビルドやテストの信頼性が向上します。