java에서 다음 에러 발생했다. 


Caused by: java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError.>

at org.apache.log4j.Log4jLoggerFactory.<clinit>(Log4jLoggerFactory.java:51)



이런 문제는 간단히 둘 중 하나를 정리한다. 나는 slf4j-log4j12를 제외시킨다. 


<exclusion>

      <groupId>org.slf4j</groupId>

      <artifactId>slf4j-log4j12</artifactId>

</exclusion>



참조)
http://www.slf4j.org/codes.html#log4jDelegationLoop

Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError.

The purpose of slf4j-log4j12 module is to delegate or redirect calls made to an SLF4J logger to log4j. The purpose of the log4j-over-slf4j module is to redirect calls made to a log4j logger to SLF4J. If both slf4j-log4j12.jar and log4j-over-slf4j.jar are present on the class path, a StackOverflowError will inevitably occur immediately after the first invocation of an SLF4J or a log4j logger.


원인은 log4j -> slf4j, slf4j-> log4j로 가는 라이브러리 때문인데.. 무한 루프를 방지하는 코드에서 발견된 것..
따라서 프로젝트가 slf4j만 쓰기로 했다면.. lib 추가할 때(또는 에러가 발생할 때)마다 mvm dependency:tree 하는 습관이 필요하다. 하나의 log정책을 사용할 필요가 있다. 따라서 slf4j로 하나로 묶어 logback을 쓰는 방식을 쓰는 정책을 사용한다고 가정한다면, 관련 lib 정책을 잘 살펴볼 필요가 있다. (아래 그림 참조)


http://www.slf4j.org/images/legacy.png


비슷한 이슈는 또 있다..

참조 )http://www.slf4j.org/codes.html 

jul-to-slf4j.jar and slf4j-jdk14.jar cannot be present simultaneously

The presence of slf4j-jdk14.jar, that is the jul binding for SLF4J, will force SLF4J calls to be delegated to jul. On the other hand, the presence of jul-to-slf4j.jar, plus the installation of SLF4JBridgeHandler, by invoking "SLF4JBridgeHandler.install()" will route jul records to SLF4J. Thus, if both jar are present simultaneously (and SLF4JBridgeHandler is installed), slf4j calls will be delegated to jul and jul records will be routed to SLF4J, resulting in an endless loop.






Posted by '김용환'
,