SLF4J: O caminho da classe contém várias ligações SLF4J

206

Estou recebendo o seguinte erro. Parece que existem várias estruturas de registro vinculadas ao sl4j. Não sei como resolver isso. Qualquer ajuda é muito 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.
user1493140
fonte
15
Resolvido Usando <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> nas dependecies (de pom.xml) que o conflito causou ajudou a resolver o problema
user1493140
6
Você já verificou slf4j.org/codes.html#multiple_bindings conforme indicado no aviso?
Peter Keller
7
Talvez seja melhor adicionar uma resposta (resposta automática) a esta pergunta e marcá-la como "Aceita", para que a pergunta apareça como "Resolvida" nas pesquisas do SO
Roberto
1
Roberto, obrigado pelo feedback. Copiei a solução do comentário e postei como resposta.
user1493140

Respostas:

125

Resolvido adicionando a seguinte exclusão nas dependências (de pom.xml) que causavam conflito.

<exclusions>
    <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
</exclusions> 
user1493140
fonte
10
que dependência causada conflito, neste caso, eu tenho árvore de dependência existem 3 menções de slf4j
PUG
22
para descobrir como log4j está ficando em seu caminho prazo mvn dependência: árvore e pente através de, em seguida, adicione o trecho acima para que a dependência no seu pom.xml
cyber-monge
1
@ user1493140 Ainda assim, não está funcionando para mim. <dependency> <groupId> log4j </groupId> <artifactId> log4j </artifactId> <versão> 1.2.17 </version> <exclusões> <exclusão> <groupId> org.slf4j </groupId> <artifactId> slf4j- log4j12 </artifactId> </exclusion> </exclusions> </dependency>
Ashok kumar Ganesan
1
para mim outra jarra guerra a causa. Eu tive que excluir os artefatos com o ID slf4j-nop e slf4j-jdk14. A dependência que causou o conflito para mim foi-trevo-plugin Maven
ihebiheb
a versão ( slf4j-log4j12) é aplicável a todos? ou devemos descobrir a versão da dependência do mvn: tree ?
Lei Yang
59

Versão Gradle;

configurations.all {
    exclude module: 'slf4j-log4j12'
}
Kerem
fonte
2
Importar modelos do aplicativo principal para a estrutura de automação ... isso resolveu meu problema com o gradle. ty.
Will
1
Existe alguma versão formiga de fazer isso?
Balaji Boggaram Ramanarayan
1
no: ant não é uma ferramenta de reconhecimento de dependência. Considere transportar sua compilação para gradle.
Matthew Mark Miller
1
recomendo vivamente portar a sua construção para sbt :)
ioleo
2
Excelente. Me salvou de algumas horas do inferno da dependência!
jseals
24

O erro provavelmente fornece mais informações como essa (embora os nomes dos seus jar possam ser diferentes)

SLF4J: Ligação encontrada em [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: ligação encontrada em [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]

Percebeu que o conflito vem de dois frascos, nomeados logback-classic-1.2.3e log4j-slf4j-impl-2.8.2.jar.

Execute mvn dependency:treenesta pasta pai do projeto pom.xml, fornecendo:

conflito de árvore de dependência

Agora escolha o que você deseja ignorar (poderia consumir um esforço delicado, preciso de mais ajuda nisso)

Eu decidi não usar o importado a partir de spring-boot-starter-data-jpa(o topo de dependência) através de spring-boot-startere através spring-boot-starter-logging, pom torna-se:

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

no pom acima spring-boot-starter-data-jpausaria o spring-boot-starterconfigurado no mesmo arquivo, que exclui logging(contém logback)

Tiina
fonte
1
Obrigado por apresentar mvn dependency:tree. É muito útil ...
Jan Lochman
10

Versão Sbt:

Anexar exclude("org.slf4j", "slf4j-log4j12")à dependência que inclui transitivamente slf4j-log4j12. Por exemplo, ao usar o Spark com o 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")
)
Ruud
fonte
1
Sbt de quê?
Petrus Theron
3
Ferramenta de compilação simples *
Benny
4
<!--<dependency>-->
     <!--<groupId>org.springframework.boot</groupId>-->
     <!--<artifactId>spring-boot-starter-log4j2</artifactId>-->
<!--</dependency>-->

Eu resolvi excluindo este: spring-boot-starter-log4j2

Gank
fonte
não está claro: você quer dizer excluir / comentar acima da seção xml ou adicionar?
Lei Yang
3

Eu apenas ignorei / removi esse arquivo jar.

insira a descrição da imagem aqui

VK_217
fonte
3

Basta usar apenas a dependência necessária, não todas :))). Para mim, para o trabalho normal do processo de registro, você precisa dessa dependência, excluir outras pessoas do 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>
musa
fonte
3

Esse problema ocorre porque a classe StaticLoggerBinder.class pertence a dois jars diferentes. essa classe faz referência a logback-classic-1.2.3.jar e a mesma classe também faz referência a log4j-slf4j-impl-2.10.0.jar. ambos de jar no caminho de classe. Portanto, há conflito entre eles. Esse é o motivo pelo qual o arquivo de log não é gerado, apesar do arquivo log4j2.xml no caminho de classe [src / main / resource].

Como selecionamos um dos jar, recomendo usar o arquivo log4j-slf4j-impl-2.10.0.jar e excluir o arquivo logback-classic-1.2.3.jar. Solução: abra o arquivo pom e visualize a dependência Hierarchy [eclipse] ou execute o
comando mvn dependency: tree para descobrir a árvore de dependência e a origem da dependência que faz o download da dependência. encontre a dependência conflitante e exclua-a. Para o aplicativo Springboot, tente isso.

<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.
Rajeev Rathor
fonte
2

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

Eu consertei com isso

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

Pradeep Charan Jadi
fonte
2

Para mim, acabou sendo um problema do Eclipse / Maven após a mudança do log4j para o logback. Dê uma olhada no seu .classpatharquivo e procure a string "log4j".

No meu caso, eu tinha o seguinte 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" />

A remoção dessas entradas do arquivo (ou você pode regenerá-lo) corrigiu o problema.

helmy
fonte
2

Para mim, a resposta foi forçar uma reconstrução do Maven. No Eclipse:

  1. Clique com o botão direito do mouse em projeto-> Maven -> Desativar Maven nature
  2. Clique com o botão direito do mouse em projeto-> Ferramentas da Primavera> Atualizar dependências do Maven
  3. Clique com o botão direito do mouse em projeto-> Configurar> Converter Projeto Maven
DS.
fonte
0

Eu tive o mesmo problema. No meu pom.xml eu tinha 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>

Quando eu excluí a dependência do spring-boot-starter-web, o problema foi resolvido.

Anna Gaitanidi
fonte
-1

A combinação <scope>provided</scope>e <exclusions>não funcionou para mim.

Eu tive que usar isso:

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

Onde empty.jarestá um arquivo jar com literalmente nada nele.

Alex R
fonte
-5

Parece remover o diretório .m2 e:

mvn install -DskipTests -T 4 resolveu esse problema para mim.

bhavin brahmkshatriya
fonte