Could not initialize class sun.awt.X11GraphicsEnvironment 오류

SoHEeeeeee·2024년 1월 15일
0

🔧오류 상황

회사 웹페이지 기능 중 데이터를 엑셀로 다운로드 받는 기능이 있다.
근데 어느날 해당 가능에 오류 로그가 올라왔다.

2024-01-10 16:27:47.494 ERROR: com.castlejsp.CastleFilter [doFilter :142] - Handler processing failed; nested exception is java.lang.NoClassDefFoundError: **Could not initialize class sun.awt.X11GraphicsEnvironment**
org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsEnvironment
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:986)
...
...

검색을 해보니 Tomcat 실행 스크립트인 catalina.sh 에서 아래와 같이 값을 바꾸면 해결된다는 글이 대부분이었다.

CATALINA_OPTS="$JPDA_OPTS $CATALINA_OPTS -Djava.awt.headless=true" 

하지만 설정값은 이미 저 코드대로 되어있었다. 다른 해결 방법이 필요했다.


💁🏻‍♀️문제 상황 분석

해당 오류는 Java에서 GUI를 처리하기 위해 사용되는 그래픽 환경 설정과 관련이 있다.
sun.awt.X11GraphicsEnvironment 클래스를 초기화하는 데 문제가 있는 상태이다.
이 클래스가 클래스 패스에서 올바르게 로드되지 않았거나 해당 클래스를 초기화하는 데 필요한 환경이 설정되지 않았을 수 있다.

→ 쉽게 말해 환경 설정에 문제가 있는 상태이다.


🫤잠깐

X11GraphicsEnvironment 클래스가 뭐야..?
Java에서 화면을 다룰 때 도움을 주는 도구로서 그래픽 사용자 인터페이스(GUI)를 만들 때 사용되며, 특히 Unix 계열 운영 체제(예:Linux)에서 사용되는 X Window System을 지원한다.

X Window System은 Unix 계열 운영 체제에서 그래픽 사용자 인터페이스(GUI)를 구현하기 위한 시스템이다. Java에서는 이 X Window System을 활용하기 위해 X11GraphicsEnvironment 클래스를 사용한다.

쉡게 말해서 Java로 창이나 버튼 같은 그래픽 요소를 만들 때, X11GraphicsEnvironment는 이 요소들을 Unix 시스템에서도 예쁘게 보이게 해주는 도구이다.


👩🏻‍💻해결방법

아무튼 여기서 발생하는 문제는 headless 모드와 관련이 있다. Headless 모드는 GUI를 그리지 않고 실행하는 모드를 의미한다.

Java 애플리케이션이 서버 환경에서 실행될 때는 보통 GUI가 필요하지 않으므로 headless 모드로 설정하여 불필요한 자원 소모를 피할 수 있다.

기존 -Djava.awt.headless=true 설정은 headless 설정 상태 곧 GUI 환경 비활성화 상태였던 것이다.

🧩하지만 회사 웹페이지의 엑셀 다운로드 처럼 몇 가지 Java 애플리케이션은 GUI 기능이 필요할 수 있다. (그래픽을 사용하여 차트를 그리거나 엑셀 다운로드와 같은 작업을 수행할 때) 이런 경우에는 headless 모드를 해제하고 GUI 환경을 활성화해야 한다.

그래서 -Djava.awt.headless=false와 같이 시스템 프로퍼티 설정을 바꾸어 Java VM에게 GUI를 활성화하도록 지시하는 것이다. 이렇게 설정하면 Java 애플리케이션은 GUI 기능을 사용할 수 있게 되며, GUI 환경이 필요한 작업을 수행할 수 있다.


💻결론

CATALINA_OPTS="$JPDA_OPTS $CATALINA_OPTS -Djava.awt.headless=false" 

true를 false로 바꾸어 문제를 해결했다.


(수정)
비슷한 오류가 다시 발생했는데 수정하는 과정을 정리 안 해놔서 순간 맞나 헷갈렸다.

🧩과정

tomcat-8/bin 로 이동해서 해당 경로에 있는 catalina.sh 파일 안에서 수정해주면 된다.
이번에는 CATALINA_OPTS="$JPDA_OPTS $CATALINA_OPTS -Djava.awt.headless=true"
해당 코드로 수정해서 오류를 해결했다.

1) vi catalina.sh 명령어로 해당 파일로 이동
2) /CATALINA_OPTS로 해당 코드가 있는 곳 찾기
3) i를 클릭해 수정 모드 들어가기
4) CATALINA_OPTS="$JPDA_OPTS $CATALINA_OPTS -Djava.awt.headless=true"해당 코드로 수정해주기
5) esc를 눌러 수정 모드 종료
6) wq! 저장 후 종료

이제 tomcat-8/bin 경로에서 톰캣을 ./shutdown.sh 종료해줬다가 ./startup.sh 다시 시작해주면 정상 작동하는 것을 확인할 수 있다.

체크한 부분이 오류 상태이고 그 위에 파일이 해결된 상태이다.


최근에 다시 같은 오류가 발생해서 true를 false로 바꾸니 해결되었다.
원인을 찾아볼 예정이다.

profile
주니어 개발자

0개의 댓글