Множественные привязки SLF4J вызывают ошибку?

У меня проблема с моим деревом зависимостей и множественным связыванием SLF4J. То, что я выяснил до сих пор, заключается в том, что обычно это вызывает только предупреждение, но в моем случае, похоже, это предотвращает запуск моей программы: Вот те исключения, которые я получаю:

SLF4J: путь класса содержит несколько привязок SLF4J. SLF4J: найденное связывание в [jar: файл:/C:/Users/FischerNi/.m2/repository/org/slf4j/slf4j-jdk14/1.5.3/slf4j-jdk14-1.5.3.jar!/Org/slf4j/осущ/StaticLoggerBinder.class] SLF4J: найдено привязку в [jar: файл:/C:/Users/FischerNi/.m2/repository/org/slf4j/slf4j-log4j12/1.6.1/slf4j-log4j12-1.6.1.jar!/Org/slf4j/осущ/StaticLoggerBinder.class] SLF4J: см. http://www.slf4j.org/codes.html#multiple_bindings для объяснения. SLF4J: slf4j-api 1.6.x(или более поздняя версия) несовместима с этим связыванием. SLF4J: Ваша привязка - версия 1.5.5 или более ранняя. SLF4J: обновите свою привязку до версии 1.6.x. или 2.0.x Исключение в потоке "main" java.lang.NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton() Lorg/slf4j/impl/StaticLoggerBinder;

и это - соответствующая часть моих зависимостей:                         net.lightbody.bmp           browsermob-прокси           2,0-бета-8       

    <!-- LOGGING DEPENDENCIES - LOG4J -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </dependency>

Может кто-нибудь, пожалуйста, скажите мне, как решить эту проблему?

Ответ 1

Есть несколько решений:

  • Убедитесь, что содержит только один slf4j jar (возможно, с более высокой версией), если у вас есть пара из них с разными версиями на пути к вашему классу.
  • Иногда бывает невозможно исключить несколько банок slf4j, поскольку они могут использоваться другими банками внутри, которые находятся на вашем пути к классу. Эти зависимые баночки могут относиться к разным версиям банок slf4j, что приводит к сбою вашего приложения. В таких случаях убедитесь, что у вас есть банка с более высокой версией SLF4j, добавленной перед другой банкой с использованием банок SLF4J. Это гарантирует, что ваша java-программа подберет последнюю версию SLF4J, которая, очевидно, имеет обратную совместимость.

Ответ 2

Если ваш проект имеет зависимость от другого проекта, а другой использует slf4j, а также с другой версией, попробуйте использовать excusion

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

Ответ 3

Я бы предложил использовать следующую зависимость в maven,

<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

Это решило мою проблему, хотя у меня больше зависимостей с помощью slf4j.

Ответ 4

Это происходит, когда имеется более одной банки. Чтобы проверить, имеется ли уже jar или нет, перейдите в проект → java resources → maven dependencies и проверьте, существует ли там банка или нет. Если это доступно, и вы все равно получите ошибку. Затем найдите местоположение этого файла jar в папке .m2\resources и удалите полную папку, связанную с этим файлом jar, затем загрузите новую версию и импортируйте ее в свой проект.:)

Когда-нибудь я получаю ошибки, даже если я загрузил правый файл jar с правильной версией в моем файле pom.xml. Затем мне нужно удалить его из моего pom.xml и загрузить эту банку из google и импортировать ее в мой проект. Убедитесь, что если вы это сделаете, не забудьте перейти к свойствам проекта → вкладка Assembly Installation → Click Add → Java Build Path Entries и нажмите на этот файл jar и нажмите Apply.

Ответ 5

Когда в пути к классу доступны несколько привязок, выберите одно и только одно связывание, которое вы хотите использовать, и удалите другие привязки.

Попробуйте удалить явно добавленную зависимость 'org.slf4j' или 'log4j2'.

Ответ 6

Ответ от Fateh правильный, мне пришлось потратить некоторое время, чтобы понять, как его использовать, поэтому я добавляю законченное решение:

  1. Запустите mvn dependency:tree

  2. выясните, какая библиотека использует slf4j:

    [INFO] +- net.lightbody.bmp:browsermob-proxy:jar:2.0-beta-8:compile
    [INFO] |  +- org.slf4j:slf4j-jdk14:jar:1.7.25:compile
    
  3. исключить его из Maven, как это:

         <dependency>
            <groupId>net.lightbody.bmp</groupId>
            <artifactId>browsermob-proxy</artifactId>
            <version>2.0.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-jdk14</artifactId>
                </exclusion>
            </exclusions>
        </dependency>