2016-05-30 5 views
4

ich diesen Fehler auszuschließen bin immer, wenn sie auf mein Projekt Unit-Tests ausgeführt werden:Gradle & SLF4J Verweigerung Abhängigkeiten transitiv Ergebnisse in Illegal

Caused by: java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path, preempting StackOverflowError. See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details. 
    at org.slf4j.impl.Log4jLoggerFactory.<clinit>(Log4jLoggerFactory.java:54) 
    ... 29 more 

ich SLF4J, aber nicht den Konflikt müssen, dass die folgenden Abhängigkeiten einrichten wird:

dependencies { 
    compile("org.springframework:spring-core:$springVersion") 
    compile("org.springframework:spring-jdbc:$springVersion") 
// compile("org.springframework:spring-orm:$springVersion" 
    compile("org.springframework:spring-tx:$springVersion") 
    compile("org.springframework.data:spring-data-jpa:1.10.1.RELEASE") { 
     exclude module: "slf4j-api" 
     exclude module: "slf4j-over-slf4j" 
     exclude module: "jcl-over-slf4j" 
    } 
    // tag::jetty[] 
    compile("org.springframework.boot:spring-boot-starter-web:1.3.5.RELEASE") { 
     exclude module: "spring-boot-starter-tomcat" 
     exclude module: "slf4j-api" 
     exclude module: "slf4j-over-slf4j" 
     exclude module: "jcl-over-slf4j" 
    } 
    compile("org.springframework.boot:spring-boot-starter-jetty") 
    // end::jetty[] 
    // tag::actuator[] 
    compile("org.springframework.boot:spring-boot-starter-actuator") 
    // end::actuator[] 
    testCompile("junit:junit") 
    compile(group: 'org.hibernate.javax.persistence', name: 'hibernate-jpa-2.1-api', version: '1.0.0.Final') 
    compile("org.apache.velocity:velocity:1.7") 
    compile(group: 'org.slf4j', name: 'slf4j-api', version: '1.7.21') 
    compile('org.slf4j:log4j-over-slf4j:1.7.21') 
    compile(group: 'org.projectlombok', name: 'lombok', version: '1.16.8') 
    testCompile("org.springframework.boot:spring-boot-starter-test") 
    testCompile(group: 'junit', name: 'junit', version: '4.11') 
} 

ich den Fehler über stoppen kann:

configurations { 
    all*.exclude group: "org.slf4j" 

} 

aber dann bekomme ich ClassNotFoundExceptions zur Laufzeit, weil slf4j benötigt wird (und seine Adapter).

Irgendwelche Ideen? Ich möchte nur slf4j von Spring Abhängigkeiten ausschließen. Ich habe viele Threads zu diesem Thema gesehen, aber nicht gelöst - sind meine Ausschlüsse korrekt?

Antwort

2

Ihr Problem ist, dass Sie log4j-over-slf4j haben - das leitet alle log4j Protokollierung slf4j - undslf4j-log4j12 - die Ausgänge alle slf4j Protokollierung log4j - in Ihrem Classpath. Das heißt, Sie hätten eine Endlosschleife, die natürlich falsch ist.

Sie müssen also entscheiden, was Sie wollen. Haben Sie alle log4j Protokollierung slf4j umleiten möchten und dann direkt alle slf4j Protokollierung zu einem anderen Logging-Framework (oder slf4j-simple zB für die Anmeldung an System.out oder keine Bindung, die Protokollierung zu unterdrücken) oder haben Sie alle slf4j Protokollierung log4j lenken wollen, dann Es macht keinen Sinn, die log4j Protokollierung zuerst an slf4j umzuleiten.

Wie Sie Ihr Problem richtig lösen, hängt stark vom gewünschten Ergebnis ab.
Sie können auch herausfinden, was eine Abhängigkeit mithilfe der Task "dependencyInsight" aufruft.

+0

Ich habe eigentlich egal, ich will es einfach arbeiten! Los geht's mit log4j - wie löse ich es? –

+1

'configurations.all {ausschließen group: 'org.slf4j', modul: 'slf4j-over-slf4j'}' btw. Sie sollten 'slf4j-api' nicht ausschließen und wenn Sie die Protokollierung von libs, die java commons logging verwenden, sollten Sie' jcl-over-slf4j' nicht ausschließen. Entfernen Sie natürlich auch die explizite Abhängigkeit von 'log4j-over-slf4j'. Fügen Sie dann 'slf4j-log4j12' hinzu und konfigurieren Sie' log4j' entsprechend Ihren Anforderungen. – Vampire

+0

Danke für die Hilfe. Ich habe Spring-Boot-Starter-Logging entfernt und es hat alles aussortiert. –

9

ich nur spring-boot-starter-logging ausgeschlossen:

configurations { 
    all*.exclude module: 'spring-boot-starter-logging' 
} 

Meine Abhängigkeiten wie folgt aussehen jetzt:

dependencies { 
    compile "org.springframework:spring-core:$springVersion" 
    compile "org.springframework:spring-jdbc:$springVersion" 
    compile "org.springframework:spring-orm:$springVersion" 
    compile "org.springframework:spring-tx:$springVersion" 
    compile "org.springframework.data:spring-data-jpa:1.10.1.RELEASE" 
    compile("org.springframework.boot:spring-boot-starter-web") { 
     exclude module: "spring-boot-starter-tomcat" 
    } 
    compile("org.springframework.boot:spring-boot-starter-jetty") 
    compile group: 'org.hibernate.javax.persistence', name: 'hibernate-jpa-2.1-api', version: '1.0.0.Final' 
    compile "org.apache.velocity:velocity:1.7" 
    compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.21' 
    compile group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.21' 
    compile group: 'org.projectlombok', name: 'lombok', version: '1.16.8' 
    testCompile("junit:junit") 
    testCompile "org.springframework.boot:spring-boot-starter-test" 
    testCompile group: 'junit', name: 'junit', version: '4.11' 
} 
Verwandte Themen