Programming Language/Java

[Java/Error] 서버 기동 시 발생하는 log4j 에러(라이브러리 버전 충돌)

Ma_Sand 2024. 9. 7. 12:29
반응형
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.logging.log4j.util.LoaderUtil.newCheckedInstanceOfProperty(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object;
        at org.apache.logging.log4j.core.util.Loader.newCheckedInstanceOfProperty(Loader.java:338)
        at org.apache.logging.log4j.core.impl.Log4jContextFactory.createContextSelector(Log4jContextFactory.java:98)
        at org.apache.logging.log4j.core.impl.Log4jContextFactory.<init>(Log4jContextFactory.java:59)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at java.lang.Class.newInstance(Class.java:442)
        at org.apache.logging.log4j.LogManager.<clinit>(LogManager.java:96)

위 에러는 log4j 라이브러리에서 특정 메소드를 찾을 수 없다는 에러이다.

주로 다음의 원인으로 발생할 수 있다.

  • log4j 라이브러리 버전 불일치: 현재 사용 중인 log4j 버전과 위 에러에서 해당 메소드를 호출하는 라이브러리 버전이 일치하지 않을 수 있다.
  • 의존성 문제: Maven 또는 Gradle을 사용하는 경우, 의존성 설정하는 부분에서 log4j가 여러 버전으로 설정되어 있을 수 있다.
  • 클래스패스 문제: 애플리케이션의 클래스패스에 잘못된 버전의 log4j가 포함되어 있을 수 있다.

테스트해야 할 프로그램의 서버 모듈 기동 시 다음 에러가 발생하였다.

나의 경우에는 서버 모듈의 외부 라이브러리에 여러 버전의 log4j 라이브러리가 존재했었다.

$ ls -l | grep log4j

$ ls -l | grep slf

사진을 보면 다음 jar 파일들이 버전 충돌된다. 낮은 버전은 전부 삭제하고 가장 높은 버전만 남긴다.

  • log4j-api-*.jar
  • log4j-core-*.jar
  • log4j-jul-*.jar
  • log4j-web-*.jar
  • log4j-slf4j-impl-*.jar

그리고 jcl-over-slf4j-1.7.28.jar와 log4j-slf4j-impl-2.17.1.jar, slf4j-log4j12-1.7.28.jar는 전부 동일한 역할을 하기 때문에 log4j-slf4j-impl-2.17.1.jar만 남기고 나머지 2개는 삭제하였다.

$ ls -l | grep log4j

$ ls -l | grep slf4j

 

위 작업 후에 서버 모듈을 재기동하였더니 오류 없이 정상적으로 기동되었다.

 

반응형