SLF4J: путь класса содержит несколько привязок SLF4J

Я получаю следующую ошибку. Кажется, существует несколько фреймворков регистрации, связанных с sl4j. Не знаете, как это решить. Любая помощь приветствуется.

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.

Ответ 1

Решено, добавив следующее исключение в зависимостях (pom.xml), которые вызвали конфликт.

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

Ответ 2

Gradle версия;

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

Ответ 3

Ошибка, вероятно, дает больше информации, как это (хотя ваши имена банок могут отличаться)

SLF4J: найдено связывание в [Баночка: файл /D: /Java/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: найдено связывание в [Баночка: файл /D: /Java/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.8.2/log4j-slf4j-impl-2.8.2.jar/орг /SLF4J/осущ/StaticLoggerBinder.class]

Заметил, что конфликт происходит из двух банок, названных logback-classic-1.2.3 и log4j-slf4j-impl-2.8.2.jar.

Запустите mvn dependency:tree в родительской папке pom.xml этого проекта, получив:

dependency tree conflict

Теперь выберите тот, который вы хотите игнорировать (может потребоваться деликатное усилие, мне нужно больше помощи в этом)

Я решил не использовать тот, который импортирован из spring-boot-starter-data-jpa (верхняя зависимость) через spring-boot-starter и через spring-boot-starter-logging, pom становится:

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

в вышеупомянутом пом spring-boot-starter-data-jpa будет использовать spring-boot-starter, настроенный в том же файле, за исключением logging (он содержит logback)

Ответ 4

Версия Sbt:

Добавить exclude("org.slf4j", "slf4j-log4j12") в зависимость, которая транзитивно включает slf4j-log4j12. Например, при использовании Spark с 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")
)

Ответ 5

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

Я решил удалить это: spring-boot-starter-log4j2

Ответ 6

Я просто проигнорировал/удалил этот файл jar.

введите описание изображения здесь

Ответ 7

Просто используйте только требуемую зависимость, не все:))). Для меня, для нормальной работы процесса регистрации вам нужна эта зависимость, исключая других из 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>

Ответ 8

... org.codehaus.mojo cobertura-maven-plugin 2.7 test ch.qos.logback logback-классические инструменты com.sun...

## Я исправил это

... org.codehaus.mojo cobertura-maven-plugin 2.7 test ch.qos.logback logback-классические инструменты com.sun...

Ответ 9

Для меня это оказалось проблемой Eclipse/Maven после переключения с log4j на logback. Загляните в ваш файл .classpath и найдите строку "log4j".

В моем случае у меня было следующее: <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"/>

Удаление этих записей из файла (или вы можете восстановить его) исправило проблему.

Ответ 10

Для меня ответом было заставить Maven восстановить. В Затмении:

  1. Щелкните правой кнопкой мыши project-> Maven → Disable Maven nature
  2. Щелкните правой кнопкой мыши project-> Spring Tools> Обновить зависимости Maven.
  3. Щелкните правой кнопкой мыши project-> "Настроить"> "Преобразовать проект Maven".

Ответ 11

Это проблема, потому что класс StaticLoggerBinder.class принадлежит двум разным jar файлам. ссылки на этот класс из logback-classic-1.2.3.jar и того же класса также ссылаются на log4j-slf4j-impl-2.10.0.jar. обе банки в classpath. Следовательно, между ними существует конфликт. Это причина того, что файл журнала не генерируется, даже если файл log4j2.xml находится в classpath [src/main/resource].

Мы выбрали один из jar, я рекомендую использовать файл log4j-slf4j-impl-2.10.0.jar и исключить файл logback-classic-1.2.3.jar. Решение: откройте файл pom и просмотрите иерархию зависимостей [eclipse] или выполните
mvn dependency: команда дерева для определения дерева зависимостей и источника зависимости, которая загружает зависимость. найти конфликтующие зависимости и исключить их. Для приложения Springboot попробуйте это.

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

Ответ 12

Комбинация <scope>provided</scope> и <exclusions> не сработала для меня.

Я должен был использовать это:

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

Где empty.jar - это файл jar, в котором буквально ничего нет.

Ответ 13

Этот вопрос занял у меня целый день. Наконец я решил использовать не очень хороший трюк. Просто поставьте одну из приведенных ниже зависимостей maven в самом начале вашего файла pom.xml. Используйте любой файл file.slf4j-nop.jar, slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar или logback-classic.jar, он должен выполнить эту работу. Обратите внимание: используйте последние банки из maven. Здесь ссылка!. Это хорошо читать. Чтобы понять, что вам нужно удалить баны slf4j, созданные в локальном репозитории (в моей папке с именем ".m2" ) и запустить ваш проект как Maven clean и установить Maven и посмотреть все загружаемые maven-банки. И вы поймете, как JVM выбирает последнюю (банку) для нашей программы. Чтобы понять далее, пожалуйста, удалите зависимость POM из файла pom.xml и снова перейдите в локальный репозиторий и удалите все банеры SLF4J и запустите проект, как Maven clean и maven install, и заставит вас следить за загрузками, которые происходит через maven, а затем запускает ваше приложение, чтобы увидеть аффект. Вы можете заметить, что ошибка или исключение не будут влиять на размещение или упоминание зависимости в начале, поскольку это связано с тем, что JVM рассматривает первый барабан в нашем проекте. Но это нехороший ход. Я бы сказал, использование исключения в api или баночках, где вы обнаружите, что конкретный api загружает банку slf4j. Что-то я заметил, несколько банок (например: аннотации спящего режима и т.д.) Загружают slf4j, когда мы создаем проект maven. И именно по этой причине в наш проект вводят несколько контейнеров slf4j. Надеюсь, это поможет. Это только мой опыт.

Ответ 14

Кажется, удаляет каталог .m2 и:

mvn install -DskipTests -T 4 разрешил эту проблему для меня.