Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.Log4jLoggerFa

2888 단어 필기
오늘 프로젝트 단원 테스트 환경 달리기 테스트 용례를 구축할 때 치명적인 오류가 발생했습니다:Caused by:java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.Log4jLoggerFactory 이게 무슨 상황이죠?콘솔 출력 정보를 보면 SLF4J: Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError. SLF4J: See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.
위에서 설명한 사이트 힌트 정보를 뒤적였습니다: 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 SLF4J is bound with slf4j-log4j12.jar and log4j-over-slf4j.jar is also present on the class path, a StackOverflowError will inevitably occur immediately after the first invocation of an SLF4J or a log4j logger.
slf4j-log4j12는 SLF4J의 로그를 로그 4j를 통해 출력하는 에이전트나 리셋을 위한 것입니다. 로그 4j-over-slf4j의 목적은 로그 4j의 로그를 SLF4J로 다시 출력하는 것입니다. 만약 두 사람이 하나의class path에서 Stack Overflow의 오류를 일으킨다면, 두 사람이 사순환에 빠지기 때문입니다.SLF4J와 log4j를 모르는 학생은 다음과 같이 이동할 수 있습니다.http://www.importnew.com/7450.html자세히 읽다.
그래서 나는 프로젝트의 마벤트 의존을 찾았는데 3개의 의존 중 slf4j-log4j12가 나타났다는 것을 발견했다.jar, 모든 의존에:
<exclusions>           
        <exclusion>
             <groupId>org.slf4jgroupId>
             <artifactId>slf4j-log4j12artifactId>
         exclusion>
 exclusions>

결국 문제를 해결했다.
다시 테스트 용례를 뛰었을 때, 또 한 무더기의 오류가 보이지 않았다. SLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in [jar:file:/Users/wangzhiang/.m2/repository/ch/qos/logback/logback-classic/1.1.3/logback-classic-1.1.3.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/Users/wangzhiang/.m2/repository/org/slf4j/slf4j-log4j12/1.6.1/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
이유: SLF4J는 컴파일할 때 import org를 바인딩합니다.slf4j.impl.StaticLoggerBinder; 이 클래스에서는 구체적인 로그 방안에 대한 귀속 접속을 실현합니다.SLF4J 기반의 모든 실현에는 이런 종류가 있어야 한다.예를 들어 slf4j-log4j12-1.61은log4j에 대한 적당한 배합 실현을 제공한다.내 프로젝트에logback-classic-1.1.3과 slf4j-log4j12-1.61 두 개의 SLF4J를 실현하는 가방이 동시에 나타나면 위의 오류가 발생하고 의존하는 exclusion이 slf4j-log4j12를 제거하면 된다.
전재:http://www.tonitech.com/2464.html

좋은 웹페이지 즐겨찾기