본문 바로가기
프로그래밍/JAVA

apache-jsp exceeding the 65535 bytes limit

by 애플 로그 2023. 5. 24.
반응형

jetty 9.4.x 버전에서 apache-jsp dependency를 추가하고 사용하다가 발생한 에러를 정리합니다.

 

에러 내용

javax.servlet.ServletException: org.apache.jasper.JasperException: Unable to compile class for JSP: 

An error occurred at line: [153] in the generated java file: [C:\Users\ynkim\AppData\Local\Temp\jetty-0_0_0_0-19090-webapp--any-5894429484268535853\jsp\org\apache\jsp\WEB_002dINF\jsp\scenariobot\map_jsp.java]
The code of method _jspService(HttpServletRequest, HttpServletResponse) is exceeding the 65535 bytes limit

 

나의 경우는 jetty를 사용하고 있으나, WAS의 종류라기보다는 jasper를 apache-jsp (tomcat에서도 동일한 것을 사용) 

사용하면서 발생하는 것으로 보인다.

 

jetty 9.4의 dependency를 살펴보면 jetty 9.2 버전의 경우는 jetty-jsp를 사용했으나, apache-jsp로 변경되었다.

대부분의 web 검색 시 tomcat에서 발생되었다고 하나, jetty에서도 발생할 수 있는 문제이다.

 

 

		<dependency>
			<groupId>org.eclipse.jetty</groupId>
			<artifactId>apache-jsp</artifactId>
			<scope>9.4.51.v20230217</scope>
		</dependency>

 

apache-jsp의 dependency 구조

apache-jsp의 하위 compile dependency로 org.mortbay.jasper:apache-jsp 8.5.70이 있는 것을 확인할 수 있다.

 

문제해결

문제해결 방법은 생각보다 간단했다.

web.xml 에 아래 내용을 추가해 주자.

<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <init-param>
        <param-name>mappedfile</param-name>
        <param-value>false</param-value>
    </init-param>
</servlet>

 

원인분석

jsp의 파일 내용이 65535 byte이상 되는 파일을 호출하면 위와 같은 에러가 발생함.

실제 문제가 되는 jsp파일의 용량은 200KB가 넘었다.

 

jsp는 컴파일러를 통해 아래와 같이 두 번 변환된다.

  • jsp -> java
  • java -> class

 

 

[문제 상황]

map_jsp.java 파일은 생성되었으나, class 파일은 생성되지 않았다.

jsp 파일 기준 라인당 하나씩 out.write를 찍고 있다. 

 

 

[해결 후]

mappedfile 옵션을 false로 주고 난 뒤에 동일한 파일 map_jsp.java을 찾아보았다.

java 파일의 크기는 2765KB이다.

out.write 값 안에 jsp의 여러 라인의 값이 들어가 있는 것을 볼 수 있다.

 

 

 

apache 공식 홈페이지

apache 공식홈페이지에서 mappedfile 옵션에 대한 자세한 정보를 확인하시기 바랍니다.

 

apache 홈페이지 참조 정보 (클릭)

mappedfile 옵션에 대해 이렇게 설명하고 있다.

디버깅을 용이하게 하기 위해 입력 라인당 하나의 인쇄 문으로 콘텐츠를 생성해야 합니까?

기본 : true

 

즉, 기본값 true의 경우는 jsp를 컴파일하면 라인당 하나의 out.print의 class 파일로 변환한다는 것이다.

라인수가 많아지면서, out.print 문의 개수가 많아지고 파일의 용량이 증가한다.

댓글