Apache Tomcat 7.x on Java 8
1. jsp 파일을 호출 할 때 발생하는 에러
org.apache.jasper.compiler.JDTCompiler$1 findType SEVERE: Compilation error org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException at org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader.<init>(ClassFileReader.java:372) at org.apache.jasper.compiler.JDTCompiler$1.findType(JDTCompiler.java:232) at org.apache.jasper.compiler.JDTCompiler$1.findType(JDTCompiler.java:188)
org.apache.catalina.core.ApplicationDispatcher invoke SEVERE: Servlet.service() for servlet jsp threw exception org.apache.jasper.JasperException: Unable to compile class for JSP: An error occurred at line: 1 in the generated java file The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class files An error occurred at line: 1 in the generated java file The type java.io.ObjectInputStream cannot be resolved. It is indirectly referenced from required .class files Stacktrace: at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:102) at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:331) at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:469)
2. 원인
Apache Tomcat 7.x 중 오래된 버전의 jsp 컴파일러는 Java 8 과 호환되지 않는다.
jsp 컴파일러는 jsp 파일을 .java (Servlet) 파일로 변환하고, 그 .java 파일을 .class 파일로 컴파일하는 역활을 담당한다.
3. 해결방안
JDK 7 로 다운그레이드 하는 방법도 생각해 볼 수는 있겠지만, 현재 단계에서 검토 가능한 현실적인 시나리오라고 할 수는 없다.
공식적으로 추천할 수 있는 방안은 Apache Tomcat 9.x 로 업그레이드 하는 것이라고 할 수 있다.
Apache Tomcat 10.x 이후의 버전은 응용프로그램의 소스코드를 변경해야 할 것이다.
다만 Apache Tomcat 버전을 올리는 것은 다급한 사람들에게 적절한 해결책이 아니다.
이런 일들은 사전에 모든 기능이 정상적으로 동작하는지 충분한 테스트 해야 하고, 업그레이드 이후에는 집중적인 모티터링도 해야 한다.
장애나 에러가 발생한 경우 원인을 명확하게 하기 위해서 다른 변경사항과 함께 반영하지 않는다.
임기웅변으로라도 당장 문제를 해결하려면, Apache Tomcat 7.x 의 lib 디렉토리에서 ecj 혹은 jasper-jdt 로 시작하는 파일을 Java 8 과 호환되는 버전으로 교체한다.
https://archive.apache.org/dist/tomcat/ 에서 Apache Tomcat 7.x 의 마지막 버전인 apache-tomcat-7.0.109 의 ecj-4.4.2.jar 정도가 적당해 보인다.
Apache Tomcat 8.x 이하는 EOL 이므로, https://archive.apache.org/dist/tomcat/ 에서 다운로드 한다.