Headless 模式是 Java SE 在缺乏顯示器、鍵盤、滑鼠等硬體裝置環境下的運行配置。雖然聽起來反直覺,但在此模式下仍可完成圖形渲染、影像生成、列印等操作——生成的圖形資料可傳遞至有顯示環境的系統進一步處理。
java.awt.Toolkit 是 AWT 所有實作類的抽象父類。Headless 環境下:
| 類別 | Headless 支援 | 說明 |
|---|---|---|
| Button、Checkbox、Choice、Dialog、FileDialog、Frame、Label、List、Menu、MenuBar、MenuItem、PopupMenu、Scrollbar、ScrollPane、TextArea、TextField、Window | ❌ 拋出 HeadlessException | 重量級組件,需 OS 圖形子系統支援 |
| Canvas、Panel、Image、Swing 輕量級組件(非 Top-level) | ✅ 正常運作 | 輕量級組件,可用空圖形函數實作 |
System.setProperty("java.awt.headless", "true");
java -Djava.awt.headless=true MyApp
export JAVA_OPTS="-Djava.awt.headless=true"
// 建立 Headless Toolkit 實例 Toolkit tk = Toolkit.getDefaultToolkit(); // 檢查模式 GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); boolean isHeadless = ge.isHeadless(); // true // 支援操作清單 // ✅ 建立 Canvas、Panel、Swing 組件 // ✅ 字體查詢與文字渲染 // ✅ 顏色設定與圖形繪製 // ✅ 影像讀寫(ImageIO.read/write) // ✅ 列印服務(java.awt.print、javax.print) // ✅ 系統提示音(tk.beep())
import java.awt.*;
import java.io.*;
import java.awt.print.*;
import javax.imageio.*;
public class HeadlessBasics {
public static void main(String[] args) {
// 必須在 Toolkit 初始化前設定
System.setProperty("java.awt.headless", "true");
Toolkit tk = Toolkit.getDefaultToolkit();
tk.beep(); // 系統提示音可用
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
System.out.println("Headless mode: " + ge.isHeadless()); // true
// 驗證重量級組件不可用
testComponentCreation();
// 輕量級繪圖
final Canvas canvas = createCanvas();
// 影像處理
Image img = loadImage("grapefruit.jpg");
// 列印輸出
printCanvasAndImage(canvas, img);
}
// ... 完整實作見原文
}
Headless mode: true java.awt.HeadlessException at java.awt.Frame.<init>... Frame is created: false java.awt.HeadlessException at java.awt.Button.<init>... Button is created: false
HeadlessException 的類別與方法HeadlessException 作為遷移驗證基準Headless 模式讓 Java 圖形能力脫離硬體限制,是伺服器端圖形處理、容器化部署、自動化測試的關鍵技術。掌握其邊界與最佳實踐,能顯著擴展 Java 應用的部署彈性。