2017-01-23 4 views
1

Versuchen, das berüchtigte SLF4J Mehrfachbindungen Problem auf Gradle zu lösen. Es gibt ungefähr eine Million Lösungen für Maven hier, aber keine von ihnen übersetzt nach Gradle (offensichtlich kein Gradle-Experte). Ich habe versucht, eine Handvoll von Lösungen mit configurations aber keiner hat richtig funktioniert. Hier gibt es Fehler erhalte ich (wie ich bereits erwähnte Ich versuche, die Warnungen zu unterdrücken)Unterdrücken SLF4J Mehrfachbindung Gradle

SLF4J: Class path contains multiple SLF4J bindings. 
SLF4J: Found binding in  [jar:file:~/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-nop/1.7.22/3a4392836f875995446373b008e39cdb9a532fbe/slf4j-nop-1.7.22.jar!/org/slf4j/impl/StaticLoggerBinder.class] 
SLF4J: Found binding in [jar:file:~/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j-impl/2.7/382b070836b8940a02d28c936974db95e9bfc3a4/log4j-slf4j-impl-2.7.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 [org.slf4j.helpers.NOPLoggerFactory] 

Dies ist die einzige SLF4J Abhängigkeit in meinem Projekt:

dependencies { 
    compile group: 'org.slf4j', name: 'slf4j-nop', version: '1.7.+' 
    ... 
} 

Auch ich bin wenn ich bei der Ausführung meiner Komponententests auf das Problem zugreife, wenn das hilft.

UPDATE: Die Figur aus einer der Abhängigkeiten wird org.apache.logging verwendet, die SLF4J wiederum verwendet. Wenn ich die Gruppe für den Apache-Logger ausschließe, schlägt das gesamte Programm fehl, weil diese Abhängigkeit eine ClassNotFoundException auslöst. Also was nun?

+0

Welche anderen Abhängigkeiten gehören zu Gradle, neben SLF4J? – badjr

+0

Eine lange Liste von ihnen, wenn auch keine SLF4J oder LOG4J, zumindest direkt. Offensichtlich einer von ihnen oder mehrere haben es. – MarkII

+0

Haben Sie 'runtime.exclude group' versucht, wie in [diese Antwort] (http://stackoverflow.com/a/21765656/1461484) gezeigt? – badjr

Antwort

2

konnte durch eine Kombination der obigen Kommentare lösen. Nachdem ich die Abhängigkeiten gefunden hatte, die SLF4J hatten, fügte ich den Ausschluss hinzu, basierend auf dem, was @badjir erwähnt hatte. Das hat das Hauptproblem gelöst, obwohl ein anderes mit LOG4J entstanden ist, und wenn ich fortfahre, werde ich eine andere Frage stellen. Beispiel für eines der Abhängigkeiten:

compile (group: 'com.sparkjava', name: 'spark-core', version: '2.5.4') { 
    exclude group: 'org.slf4j' 
} 
+0

Das ist, was ich dir gesagt habe :) –

+0

Ja, sorry, versucht, die beiden Antwortanbieter zuzuschreiben. Obwohl Ihre genaue Lösung auch nicht richtig funktioniert hat, haben Sie dem Gradle Docs-Beispiel wie dem anderen Post gefolgt. In gewissem Sinne hatten Sie beide meistens Recht. – MarkII

1

Sie können die Abhängigkeit ausschließen, die Sie nicht verwenden möchten. Die Gradle docs sagt man eine Abhängigkeit wie

Gruppe ausschließen ausschließen kann: ‚org.unwanted‘, Modul: ‚iAmBuggy‘ // sowohl von Namen und Gruppe

+0

Das sieht aus wie es funktioniert, nur wenn ich die Abhängigkeit kenne, die dieses Problem verursacht. Ich versuche, für alle Abhängigkeiten auszuschließen. – MarkII

+0

Ich bin mir nicht sicher, was passiert ist, aber es hat nach dem Zufallsprinzip aufgehört zu loggen ... Keine Änderungen an meiner Gradle-Datei. Das ist frustrierend. – MarkII

+0

@MarkII, es teilt Ihnen jedoch mit, in welchen JAR-Dateien die widersprüchlichen Abhängigkeiten auftreten. Gibt es eine Möglichkeit, alle Abhängigkeiten Ihres Projekts zu betrachten und zu sehen, welche diese JAR-Dateien enthalten? – badjr

1

Dieser Fehler wird verursacht, weil Sie mehrere Bibliotheken, die das Protokollierungs-Framework slf4j verwenden. Was Sie tun müssen, ist die Bibliothek zu finden, die slf4j als Abhängigkeit transitively bringt und eine exclude (group: "slf4j's-group") hinzufügen. Eine einfache Möglichkeit, das Paket zu finden, das das Problem verursacht, ist die Verwendung von gradle dependencies, die eine Baumstruktur aller Abhängigkeiten erzeugt.

+0

Wird dies heute versuchen, da die Warnungen zurückgegeben wurden – MarkII

+0

Liefen die Abhängigkeiten und gefunden 3, die Slf4j in irgendeiner Form hatte, fügte Ihren Ausschluss (kein Glück) hinzu und fügte den Ausschluss basierend auf was ich dachte von der Gradle-Dokumentation (kein Glück) . Ehrlich gesagt hasse SLF4J an dieser Stelle wirklich. – MarkII