Java

java.awt.headless=true でも重量コンポーネントは扱えない

JavaアプリケーションのGUI部品をヘッドレス(画面無し)でも使えるようにするプロパティ、java.awt.headlessのがあります。

これはあくまで軽量コンポーネント(SwingのJLabelなど)を扱うためのもので、重量コンポーネント(java.awt.Label)などは扱えません。
そういえばJFrameも重量コンポーネントなのでフレームを内部で表示するようなテストは動かせないのでした。

https://stackoverflow.com/questions/41067235/what-is-the-benefit-of-setting-java-awt-headless-true

再現コード:

import javax.swing.*;
class Scratch {
  public static void main(String[] args) {
    System.setProperty("java.awt.headless", "true");
    new JFrame().setVisible(true);
  }
}

実行結果:

Exception in thread "main" java.awt.HeadlessException
	at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:204)
	at java.awt.Window.(Window.java:536)
	at java.awt.Frame.(Frame.java:420)
	at java.awt.Frame.(Frame.java:385)
	at javax.swing.JFrame.(JFrame.java:189)
	at Scratch.main(scratch_332.java:7)

うっかりしているとハマるかもしれないのでメモ。(実際、GitHub Actionsでテストが落ちた)