본문 바로가기
Java

log4j2, jersey, jdk1.8

by java개발자 2021. 12. 30.

log4j2 보안 이슈 때문에

jdk1.8 시스템에 log4j 1.x -> log4j 2.17.0 으로 변경하는 작업중

java.lang.ArrayIndexOutOfBoundsException 에러 발생.

 

보통 java.lang.ArrayIndexOutOfBoundsException 이슈는 고정된 배열의 크기를 넘어가면 발생하는데, 또다른 상황에서도 발생한다.

람다. lambda.

lambda가 포함된 class를 읽고, 파싱할 때, lambda를 지원하지 않는 라이브러리에서도 동일한 에러가 발생한다.

class 파일이 클래스로더 등에서 읽힐 때, byte[] 배열로 취급되기 때문에 배열 관련된 java.lang.ArrayIndexOutOfBoundsException 에러가 발생한 걸까? 더 깊게는 안봄...

 

기존에 jdk1.8 & jersey로 잘 작동하던 프로젝트에서

log4j 2.17.0 라이브러리로 교체하면서 서버가 정상 기동되지 않았다.

 

log4j 2.17.0 라이브러리 내부에 lambda로 작성된 클래스가 포함되었기 때문이다.

그리고 jersey는 package scan을 하면서 log4j2를 건드렸고(=클래스를 읽으려고 시도), jersey 라이브러리가 lambda를 지원하지 않아서 에러가 발생한 것.

 

jersey가 package를 scan할 때 의존하는 asm 라이브러리는

5_0_BETA 이상부터 jdk 1.8을 모두 지원한다. 

  • Full support of Java 8 (annotation on Java types and MethodParameters attribute)

https://asm.ow2.io/versions.html

 

그리고 jersey는 1.19부터 jdk1.8을 모두 지원한다.

https://github.com/javaee/jersey-1.x/releases/tag/1.19

 

jersey 1.18인 경우 asm-3.1을 의존하고 있는 것을 볼 수 있다. asm-3.1은 jdk1.8을 완전히 지원하지 못한다.

 

jersey가 package scan하는 범위를 축소함으로써(log4j2 package를 포함X) 이슈를 해결할 수 있다.

    <servlet>
        <servlet-name>jerseyTest</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>스캔할 패키지</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>jerseyTest</servlet-name>
        <url-pattern>/rest-apis/*</url-pattern>
    </servlet-mapping>

'Java' 카테고리의 다른 글

HotSwap, LiveReload, HotDeploy, HotReload ???  (0) 2021.07.23
java, oracle 시스템 마이그레이션시 주의  (0) 2018.04.12