SLF4J: la ruta de clase contiene varios enlaces SLF4J


206

Recibo el siguiente error. Parece que hay múltiples marcos de registro vinculados a sl4j. No estoy seguro de cómo resolver esto. Cualquier ayuda es muy apreciada.

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
El uso resuelto<exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> en las dependencias (de pom.xml) que causó el conflicto ayudó a resolver el problema
user1493140


66
¿Ya revisó slf4j.org/codes.html#multiple_bindings como se indica en la advertencia?
Peter Keller

77
Tal vez podría ser mejor agregar una respuesta (respuesta automática) a esta pregunta y marcarla como "Aceptada", por lo que la pregunta aparecerá como "Resuelta" en las búsquedas de SO
Roberto

1
Roberto, gracias por tus comentarios. Copié la solución del comentario y la publiqué como respuesta.
user1493140

Respuestas:


125

Se resolvió agregando la siguiente exclusión en las dependencias (de pom.xml) que causaron conflictos.

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

10
el cual dependencia causado conflicto en este caso, tengo árbol de dependencia hay 3 menciones de slf4j
PUG

22
para descubrir cómo log4j se está poniendo en su camino, ejecute mvn dependency: tree y peine, luego agregue el fragmento anterior a esa dependencia en su pom.xml
cyber-monk

1
@ user1493140 Aún no funciona para mí. <dependency> <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
para mí otra guerra de tarros la causa. Tuve que excluir los artefactos con id slf4j-nop y slf4j-jdk14. La dependencia que causó el conflicto para mí fue clover-maven-plugin
ihebiheb

¿Es la versión ( slf4j-log4j12) aplicable para todos? ¿o deberíamos averiguar la versión de mvn dependency: tree ?
Lei Yang

59

Versión Gradle;

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

2
Importar modelos desde la aplicación principal al marco de automatización ... esto resolvió mi problema con gradle. ty.
Será

1
¿Hay alguna versión hormiga de hacer esto?
Balaji Boggaram Ramanarayan

1
no: ant no es una herramienta consciente de dependencia. Considere seriamente portar su construcción a gradle.
Matthew Mark Miller

1
recomiendo mucho portar su construcción a SBT :)
ioleo

2
Excelente. ¡Me salvó de unas pocas horas de dependencia del infierno!
jseals

24

El error probablemente brinda más información como esta (aunque los nombres de sus jar pueden ser diferentes)

SLF4J: Enlace encontrado en [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: Enlace encontrado en [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]

Noté que el conflicto proviene de dos frascos, llamados logback-classic-1.2.3 y log4j-slf4j-impl-2.8.2.jar.

Ejecutar mvn dependency:treeen este proyecto la carpeta padre pom.xml, dando:

conflicto de árbol de dependencia

Ahora elija el que desea ignorar (podría consumir un esfuerzo delicado. Necesito más ayuda en esto)

Decidí no usar el importado de spring-boot-starter-data-jpa(la dependencia principal) de principio spring-boot-startera fin spring-boot-starter-logging, pom se convierte en:

    <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>

en pom anterior spring-boot-starter-data-jpausaría el spring-boot-starterconfigurado en el mismo archivo, que excluye logging(contiene logback)


1
Gracias por presentarnos mvn dependency:tree. Es muy útil ...
Jan Lochman

10

Versión de Sbt:

Anexar exclude("org.slf4j", "slf4j-log4j12")a la dependencia que incluye transitivamente slf4j-log4j12. Por ejemplo, al usar 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
¿Qué significa Sbt?
Petrus Theron

3
Simple Build Tool *
Benny

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

Resolví eliminar esto: spring-boot-starter-log4j2


no está claro: ¿quiere decir eliminar / comentar sobre la sección xml, o agregar?
Lei Yang el


3

Solo use la dependencia requerida, no todas :))). Para mí, para el trabajo normal del proceso de registro, necesita esta dependencia excluir a otros de 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

Esto es un problema debido a que la clase StaticLoggerBinder.class pertenece a dos jarras diferentes. esta clase hace referencia a logback-classic-1.2.3.jar y la misma clase también hace referencia a log4j-slf4j-impl-2.10.0.jar. Ambos de jar en classpath. Por lo tanto, hay conflicto entre ellos. Esta es la razón por la cual el archivo de registro no se genera aunque el archivo log4j2.xml en classpath [src / main / resource].

Tenemos que seleccionar uno de jar, recomiendo usar el archivo log4j-slf4j-impl-2.10.0.jar y excluir el archivo logback-classic-1.2.3.jar. Solución: abra el archivo pom y vea la Jerarquía de dependencias [eclipse] o ejecute el
comando mvn dependency: tree para averiguar el árbol de dependencias y la fuente de dependencia que descarga la dependencia. encuentre la dependencia conflictiva y excluyalas. Para la aplicación Springboot intente esto.

<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 prueba ch.qos.logback logback-classic tools com.sun ...

## Lo arreglé con esto

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


2

Para mí, resultó ser un problema de Eclipse / Maven después de cambiar de log4j a logback. Eche un vistazo a su .classpatharchivo y busque la cadena "log4j".

En mi caso tuve lo siguiente allí: <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" />

Eliminar esas entradas del archivo (o podría regenerarlo) solucionó el problema.


2

Para mí, la respuesta fue forzar una reconstrucción de Maven. En Eclipse:

  1. Haga clic derecho en proyecto-> Maven -> Desactivar la naturaleza Maven
  2. Haga clic derecho en proyecto-> Spring Tools> Actualizar dependencias de Maven
  3. Haga clic derecho en proyecto-> Configurar> Convertir proyecto Maven

0

Yo tuve el mismo problema. En mi pom.xml tuve ambos

 <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>

Cuando eliminé la dependencia de spring-boot-starter-web, se resolvió el problema.


-1

La combinación de <scope>provided</scope>y<exclusions> no funcionó para mí.

Tuve que usar esto:

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

¿Dónde empty.jarestá un archivo jar con literalmente nada en él?


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.