Несколько привязок SLF4J, как найти вызывающую зависимость

#slf4j

#slf4j

Вопрос:

Я получаю следующую ошибку:

 SLF4J: Found binding in [jar:file:/home/mmucha/.m2/repository/org/apache/activemq/activemq-all/5.15.8/activemq-all-5.15.8.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/mmucha/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
  

Из этого я знаю, что log4jLoggerFactory был щедро предоставлен activemq. mvn dependency:tree мне ничего не показывает, проверка pom.xml файлы в файлах activemq jar показали мне некоторые зависимости, но пока я настраиваю следующие исключения, и я все еще не могу их отключить.

Вопрос: каков правильный способ поиска конфликта? Какое исключение я упускаю?

 <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-all</artifactId>
      <version>5.15.8</version>
      <exclusions>
        <exclusion>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
        <exclusion>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.slf4j</groupId>
          <artifactId>jcl-over-slf4j</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  

ОБНОВЛЕНИЕ / ДОПОЛНИТЕЛЬНЫЙ ВОПРОС:

Я ничего не сделал с конфигурацией, но несколько раз запустил таинственную и устаревшую команду: mvn -U idea:idea

Я понятия не имею, что это дает, но каждый раз, когда idea делает что-то сверхбезумное, это немного помогает. Итак, после этого лечения фактическая привязка изменилась на:

 Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
  

это означает, что я, наконец, получаю читаемые журналы, однако раздражающее предупреждение остается, как и исходный вопрос. И любые объяснения идеи цели: идея, фиксирующая в противном случае нефиксируемую идею, также приветствовались бы. Есть идеи?

Ответ №1:

Какую IDE вы используете?

IntelliJ: — Откройте свой pom.xml

Нажмите ALT CNTRL SHIFT U или щелкните правой кнопкой мыши Диаграмму -> Показать зависимости

Теперь появится окно диаграммы, в котором вы можете выполнить поиск своих зависимостей

activemq-all-5.15.8.jar и logback-classic-1.2.3.jar

Он покажет вам графическое представление всех зависимостей. Вы можете увидеть родительский JAR, который включает эти JAR, и вы можете исключить любой JAR, который вы действительно не хотите использовать.

Комментарии:

1. Спасибо за ответ. На самом деле я использую IDEA. Я не очень понимаю эти диаграммы зависимостей. Вот что я вижу: pasteboard.co/I4wAbxs.png Ie. вы даже не можете увидеть никакой зависимости от чего-либо, связанного с log4j или slf4j, ведущего из activemq. Тем не менее, мы знаем из самого slf4j, что нарушающей библиотекой является activemq, поскольку я хочу другую, классическую logback.

2. Ну, здесь вам нужно либо полностью удалить зависимость ActiveMQ, либо исключить slf4j из JAR обратной записи. То, что вы пытаетесь сделать, это попытка исключить slf4j JAR из ActiveMQ. Однако в ActiveMQ нет JAR-файла sl4j, это тот же самый класс StaticLoggerBinder, доступный в ActiveMQ, со структурой пакета, такой же, как раньше slf4j.

3. хм. Извините, я не понимаю. Всего несколько минут назад я получал несколько сообщений log4j и logback.xml был полностью проигнорирован. После mvn -U idea:idea ситуация нормальная, но я не понимаю вашего предложения. И понятия не имею, откуда взялся log4j и куда он делся 🙂 Не могли бы вы подробнее рассказать о своем предложении?

4. Найдена привязка в [jar:file:/home/mmucha/.m2/repository/org/apache/activemq/activemq-all/5.15.8/activemq-all-5.15.8.jar!/org/slf4j/impl/StaticLoggerBinder.class] Если вы посмотрите на это, класс StaticLoggerBinder находится внутри activemq-all-5.15.8.jar . То, что мы пытались исключить, это slf4j-log4j12.jar внутри activemq

5. Извините, это выше моего понимания. Плюс ActiveMQ ведет журнал как сумасшедший на уровне отладки в стиле log4j, и я не могу это контролировать. Simple в SLF4J действительно саркастично. Кстати. Мне действительно интересно, почему я должен удалять slf4j-nop из m2, чтобы избавиться от глупых предупреждений, если я даже не объявляю это в pom. Думаю, я удалю каждое упоминание slf4j в этом небольшом инструменте, потому что это simple ведение журнала просто создает безумные проблемы. Спасибо за попытку помочь.

Ответ №2:

Вот рабочий и протестированный пример для ее решения:

 <dependencies>
<!-- Spring JMS -->
<dependency>
   <groupId>org.springframework</groupId>
    <artifactId>spring-jms</artifactId>
        <version>${springframework.version}</version>
        <exclusions>
            <exclusion>
                <artifactId>commons-logging</artifactId>
                <groupId>commons-logging</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- ActiveMQ -->
    <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-all</artifactId>
        <version>${activemq.version}</version>
    </dependency>

    <!-- Test -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <version>${spring-boot-test.version}</version>
        <scope>test</scope>
    </dependency>
</dependencies>