티스토리 뷰

톰캣 9 환경에서 Apache POI의 workbook.close() 호출 시 java.lang.ClassCastException이 발생하는 것은 주로 라이브러리 버전 불일치(Conflict) 또는 클래스 로딩 순서 문제로 인해, 같은 클래스임에도 다른 로더에 의해 로드되어 발생하는 문제입니다. 
주요 원인과 해결 방안은 다음과 같습니다.
1. 주요 원인
  • 라이브러리 중복 (가장 흔한 원인): WEB-INF/lib 폴더에 있는 POI 관련 JAR 파일(poi-ooxml, poi, xmlbeans 등)이 톰캣 서버의 lib 디렉토리나 다른 곳에 중복으로 존재하여 버전 충돌이 발생합니다.
  • 버전 불일치: poi-ooxml 버전과 poi 버전이 다르거나, xmlbeans 버전이 맞지 않는 경우입니다.
  • 톰캣 클래스 로더 충돌: 톰캣은 톰캣 자체 라이브러리(Common)와 웹 애플리케이션 라이브러리(WEB-INF/lib)를 분리하여 로드하는데, 이 과정에서 동일한 클래스가 다른 버전을 가질 때 발생합니다. 
2. 해결 방안
(1) 라이브러리 버전 통일 및 중복 제거
  • 프로젝트의 pom.xml (Maven) 또는 build.gradle (Gradle)에서 모든 POI 관련 라이브러리(poi, poi-ooxml, poi-ooxml-schemas, xmlbeans)의 버전을 동일한 버전으로 통일합니다.
  • WEB-INF/lib 내부에 혹시 다른 버전의 POI JAR 파일이 중복으로 들어가 있지 않은지 확인하고 제거합니다. 
(2) 톰캣 lib 디렉토리 확인
  • TOMCAT_HOME/lib 디렉토리에 POI 관련 JAR 파일이 있다면 제거합니다.
  • 반드시 프로젝트의 WEB-INF/lib 안에 있는 라이브러리를 사용하도록 합니다. 
(3) 소스 코드 확인: Workbook 생성 방식 변경
  • InputStream을 통해 Workbook을 생성했다면, close() 시점에 InputStream이 이미 닫혀 있어 에러가 날 수 있습니다.
  • File 객체를 직접 사용하여 Workbook을 생성하는 방식이 더 안정적입니다.
    java
    // 권장 방식
    Workbook wb = WorkbookFactory.create(new File("path/to/file.xlsx"));
    // ... 작업 ...
    wb.close();
    
     
(4) 최신 버전으로 업데이트 
  • 사용 중인 Apache POI 버전이 너무 낮다면 최신 버전(예: 4.x 또는 5.x)으로 업데이트하여 버그를 해결합니다. 
요약
대부분의 경우 WEB-INF/lib 폴더 내에 다른 버전의 Apache POI JAR 파일이 혼재되어 있는 것이 원인입니다. 관련 JAR 파일들을 삭제하고 동일한 버전을 다시 넣어주면 해결됩니다.
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함