응용팀에서 가져온 애플리케이션이 있어서 Tomcat 에 배포하고 올렸는데 잘 올라왔다.

화면을 띄워보았는데 바로 오류가 난다.

The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory
 
Stacktrace:
        org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:103)
        org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:366)
        org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:485)
        org.apache.jasper.compiler.Compiler.compile(Compiler.java:379)
        org.apache.jasper.compiler.Compiler.compile(Compiler.java:354)
        org.apache.jasper.compiler.Compiler.compile(Compiler.java:341)
        org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:657)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:727)

getJspApplicationContext 라면 Tomcat lib/jsp-api.jar 에 잘 포함이 되어 있어야 하는데, 이상하다.

조금 더 살펴본다.

이유를 알았다.

응용팀에서 WEB-INF/lib 아래에 jsp-api.jar 를 넣어두었다.

그리고 그 jsp-api.jar 는 아주 오래된 파일이었다. jar 파일을 열어보았더니 역시 getJspApplicationContext 메소드가 없었다.

Tomcat 7.0 기준으로 jsp-api.jar 는 JSP 2.2 긴데, 내 기억이 맞다면 getJspApplicationContext 는 JSP 2.1 부터 포함되어 있다.

아마도 WEB-INF/lib 아래에 있던 jsp-api.jar 는 JSP 2.0 이 아닐까 추정된다.

참고로 Tomcat 에서 클래스 로딩의 순서는 다음과 같다.

  • Bootstrap classes of your JVM
  • /WEB-INF/classes of your web application
  • /WEB-INF/lib/*.jar of your web application
  • System class loader classes (described above)
  • Common class loader classes (described above)

따라서 WEB-INF/lib/jsp-api.jar 가 Tomcat lib/jsp-api.jar 보다 먼저 적용이 된 것이다.