SLF4J: il percorso di classe contiene più associazioni SLF4J


206

Ricevo il seguente errore. Sembra che ci siano più framework di registrazione associati a sl4j. Non sono sicuro di come risolverlo. Qualsiasi aiuto è molto apprezzato.

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/admin/.m2/repository/org/slf4j/slf4j-log4j12/1.6.4/slf4j-log4j12-1.6.4.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/admin/.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.

15
Risolto L' utilizzo <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> nelle dipendenze (di pom.xml) che causavano conflitti aiutava a risolvere il problema
user1493140


6
Hai già controllato slf4j.org/codes.html#multiple_bindings come indicato nell'avvertimento?
Peter Keller,

7
Forse potrebbe essere meglio aggiungere una risposta (risposta automatica) a questa domanda e contrassegnarla come "Accettata", quindi la domanda apparirà come "Risolta" nelle ricerche SO
Roberto

1
Roberto, grazie per il feedback. Ho copiato la soluzione dal commento e l'ho pubblicata come risposta.
user1493140

Risposte:


125

Risolto aggiungendo la seguente esclusione nelle dipendenze (di pom.xml) che causavano conflitti.

<exclusions>
    <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
</exclusions> 

10
quale dipendenza ha causato conflitti in questo caso, ho un albero delle dipendenze ci sono 3 menzioni di slf4j
PUG

22
per scoprire come log4j sta arrivando sul tuo percorso esegui mvn dependency: albero e pettina, quindi aggiungi lo snippet sopra a quella dipendenza nel tuo pom.xml
cyber-monk

1
@ user1493140 Non funziona ancora per me. <dipendenza> <groupId> log4j </groupId> <artifactId> log4j </artifactId> <version> 1.2.17 </version> <exclusions> <exclusion> <groupId> org.slf4j </groupId> <artifactId> slf4j- log4j12 </artifactId> </exclusion> </exclusions> </dependency>
Ashok kumar Ganesan,

1
per me un altro vaso guerra la causa. Ho dovuto escludere i manufatti con id slf4j-nop e slf4j-jdk14. La dipendenza che ha causato il conflitto per me era clover-maven-plugin
ihebiheb

la versione ( slf4j-log4j12) è applicabile a tutti? o dovremmo scoprire la versione da mvn dependency: tree ?
Lei Yang,

59

Versione Gradle;

configurations.all {
    exclude module: 'slf4j-log4j12'
}

2
L'importazione dei modelli dall'applicazione principale nel framework di automazione .. questo ha risolto il mio problema con Gradle. ty.
Sarà il

1
Esiste una versione di formica per farlo?
Balaji Boggaram Ramanarayan,

1
no: la formica non è uno strumento sensibile alle dipendenze. Valuta fortemente il porting della tua build in modo graduale.
Matthew Mark Miller,

1
consiglio vivamente il porting della tua build su sbt :)
ioleo,

2
Eccellente. Mi ha salvato da poche ore di inferno di dipendenza!
jseals

24

L'errore probabilmente fornisce più informazioni come questa (anche se i nomi dei tuoi jar potrebbero essere diversi)

SLF4J: Trovato il binding in [jar: file: / D: /Java/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar! / Org / slf4j / impl / StaticLoggerBinder .class] SLF4J: Trovato il binding in [jar: file: / D: /Java/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.8.2/log4j-slf4j-impl-2.8.2.jar ! /org/slf4j/impl/StaticLoggerBinder.class]

Notato che il conflitto proviene da due vasetti, chiamati logback-classic-1.2.3e log4j-slf4j-impl-2.8.2.jar.

Esegui mvn dependency:treein questo progetto la cartella principale pom.xml, fornendo:

conflitto dell'albero delle dipendenze

Ora scegli quello che vuoi ignorare (potrebbe richiedere uno sforzo delicato, ho bisogno di più aiuto su questo)

Ho deciso di non usare quello importato da spring-boot-starter-data-jpa(la massima dipendenza) fino spring-boot-starterin fondo spring-boot-starter-logging, pom diventa:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

sopra pom spring-boot-starter-data-jpauserebbe il spring-boot-starterconfigurato nello stesso file, che esclude logging(contiene logback)


1
Grazie per aver introdotto mvn dependency:tree. È molto utile ...
Jan Lochman,

10

Versione Sbt:

Accoda exclude("org.slf4j", "slf4j-log4j12")alla dipendenza che include transitivamente slf4j-log4j12. Ad esempio, quando si utilizza Spark con Log4j 2.6:

libraryDependencies ++= Seq(
  // One SLF4J implementation (log4j-slf4j-impl) is here:
  "org.apache.logging.log4j" % "log4j-api" % "2.6.1",
  "org.apache.logging.log4j" % "log4j-core" % "2.6.1",
  "org.apache.logging.log4j" % "log4j-slf4j-impl" % "2.6.1",
  // The other implementation (slf4j-log4j12) would be transitively
  // included by Spark. Prevent that with exclude().
  "org.apache.spark" %% "spark-core" % "1.5.1" exclude("org.slf4j", "slf4j-log4j12")
)

1
Cosa significa Sbt?
Petrus Theron

3
Strumento di creazione semplice *
Benny,

4
<!--<dependency>-->
     <!--<groupId>org.springframework.boot</groupId>-->
     <!--<artifactId>spring-boot-starter-log4j2</artifactId>-->
<!--</dependency>-->

Ho risolto eliminando questo: spring-boot-starter-log4j2


non chiaro: vuoi dire cancellare / commentare sopra la sezione xml o aggiungere?
Lei Yang,


3

Usa solo la dipendenza richiesta, non tutte :))). Per me, per il normale lavoro di registrazione è necessaria questa dipendenza escludere gli altri da pom.xml

<dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.5</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.1.8</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.1.8</version>
    </dependency>

3

Questo è un problema a causa della classe StaticLoggerBinder.class che appartiene a due diversi vasetti. questa classe fa riferimento a logback-classic-1.2.3.jar e la stessa classe a cui fa riferimento anche log4j-slf4j-impl-2.10.0.jar. entrambi i vasi in classpath. Quindi c'è conflitto tra loro. Questo è il motivo per cui il file di registro non viene generato anche se il file log4j2.xml nel percorso di classe [src / main / resource].

Abbiamo quindi selezionato uno dei file jar, consiglio di utilizzare il file log4j-slf4j-impl-2.10.0.jar ed escludere il file logback-classic-1.2.3.jar. Soluzione: aprire il file pom e visualizzare la gerarchia delle dipendenze [eclipse] o eseguire
mvn dependency: comando tree per scoprire l'albero delle dipendenze e l'origine della dipendenza che scarica la dipendenza. trovare la dipendenza in conflitto ed escluderli. Per l'applicazione Springboot provare questo.

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-logging</artifactId>
                    </exclusion>
                </exclusions>
        </dependency>
    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

This is working fine for me after struggling a lots.

2

... org.codehaus.mojo cobertura-maven-plugin 2.7 test ch.qos.logback logback-classic tools com.sun ...

## Ho risolto con questo

... org.codehaus.mojo cobertura-maven-plugin 2.7 test ch.qos.logback logback-classic tools com.sun ...


2

Per me, si è rivelato essere un problema Eclipse / Maven dopo il passaggio da log4j al logback. Dai un'occhiata al tuo .classpathfile e cerca la stringa "log4j".

Nel mio caso ho avuto quanto segue lì: <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-log4j12/1.7.1/slf4j-log4j12-1.7.1.jar"/> <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.17/log4j-1.2.17.jar" />

La rimozione di quelle voci dal file (o è possibile rigenerarlo) ha risolto il problema.


2

Per me la risposta è stata quella di forzare una ricostruzione di Maven. In Eclipse:

  1. Fare clic destro sul progetto-> Maven -> Disabilita natura Maven
  2. Fare clic con il tasto destro del mouse sul progetto-> Strumenti a molla> Aggiorna dipendenze Maven
  3. Fare clic destro su progetto-> Configura> Converti progetto Maven

0

Ho avuto lo stesso problema. Nel mio pom.xml avevo entrambi

 <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.28</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.2.1.RELEASE</version>
    </dependency>

Quando ho eliminato la dipendenza web spring-boot-starter-web, il problema è stato risolto.


-1

La combinazione di <scope>provided</scope>e <exclusions>non ha funzionato per me.

Ho dovuto usare questo:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <scope>system</scope>
    <systemPath>${project.basedir}/empty.jar</systemPath>
</dependency>

Dove si empty.jartrova un file jar con letteralmente nulla in esso.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.