상황
원인
// org.apache.poi.ss.util.SheetUtil 중 일부
package org.apache.poi.ss.util;
import java.awt.font.FontRenderContext;
import java.awt.font.TextAttribute;
import java.awt.font.TextLayout;
import java.text.AttributedString;
import org.apache.poi.ss.usermodel.*;
public class SheetUtil {
public static double getCellWidth(Cell cell, int defaultCharWidth, ...) {
// ...
AttributedString str = new AttributedString(stringVal);
copyAttributes(font, str, 0, stringVal.length());
// ⚠️ 여기서 java.awt.font.TextLayout을 생성합니다.
// FontRenderContext 및 TextLayout 내부에서 시스템 그래픽스 툴킷(AWT Toolkit)을 조회합니다.
TextLayout layout = new TextLayout(str.getIterator(),
new FontRenderContext(null, true, true));
// 텍스트의 실제 그래픽 바운딩 박스(너비)를 계산
return layout.getBounds().getWidth();
}
}
1. new Font(...) 또는 new TextLayout(...) 호출
2. JVM 내부: java.awt.Toolkit.getDefaultToolkit() 호출
3. 시스템 프로퍼티 점검: java.awt.headless 값이 true인가?
├── [True] -> HeadlessToolkit 인스턴스 로드 (X11 디스플레이 없이 순수 메모리 연산 모드)
└── [False] -> 리눅스 X11 GUI 툴킷(sun.awt.X11.XToolkit) 로드 시도
└── OS 환경변수 DISPLAY(예: ':0.0')로 윈도우 서버 소켓 연결 시도
└── 연결 실패! -> java.awt.AWTError 발생
해결 방법
Tomcat bin/setenv.sh에 JVM 옵션 추가
export CATALINA_OPTS="$CATALINA_OPTS -Djava.awt.headless=true"