Maven SL4J несколько привязок, предыдущие решения не удаются - PullRequest
0 голосов
/ 25 мая 2018

У меня есть проект с несколькими привязками SLF4J.Я прочитал и попробовал решения в этом SO сообщении , в этом другом SO сообщении и на веб-сайте slf4j .

Что я вижу, если этокогда я запускаю код

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/Mike/.m2/repository/org/jlab/coat/coat-libs/5.1-SNAPSHOT/coat-libs-5.1-SNAPSHOT.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/Mike/.m2/repository/org/slf4j/slf4j-log4j12/1.7.16/slf4j-log4j12-1.7.16.jar!/org/slf4j/impl/StaticLoggerBinder.class]

Однако в моем файле pom.xml у меня уже есть

    <dependency>
        <groupId>org.jlab.coat</groupId>
        <artifactId>coat-libs</artifactId>
        <version>5.1-SNAPSHOT</version>
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

и в зависимости mvn: дерево Я не вижу этой зависимости дляjar исключения, только для jar Spark, то есть

[INFO] com.IKP:DCdatabase:jar:0.0.1-SNAPSHOT
[INFO] +- org.jlab.coat:coat-libs:jar:5.1-SNAPSHOT:compile
[INFO] +- org.apache.spark:spark-core_2.11:jar:2.2.1:compile
...
...
...
[INFO] |  +- org.slf4j:slf4j-api:jar:1.7.16:compile
[INFO] |  +- org.slf4j:jul-to-slf4j:jar:1.7.16:compile
[INFO] |  +- org.slf4j:jcl-over-slf4j:jar:1.7.16:compile
[INFO] |  +- log4j:log4j:jar:1.2.17:compile
[INFO] |  +- org.slf4j:slf4j-log4j12:jar:1.7.16:compile

Я также попробовал еще несколько шагов, таких как очистка моего каталога .m2 и сборка всех исходных текстов с нуля, но я все еще вижу этот двойнойпривязка.

Нюанс, который возникает, заключается в том, что подавление журнала для Spark действительно происходит, т.е.

    Logger.getLogger("org.apache.spark.SparkContext").setLevel(Level.WARN);
    Logger.getLogger("org").setLevel(Level.OFF);
    Logger.getLogger("akka").setLevel(Level.OFF);

Больше не отключаю уровни, и я вижу все уровни.

Есть ли другой способ удалить эту множественную привязку для SLF4J?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Мне кажется, что coat-libs был упакован как Uber JAR, поэтому slf4j не отображается как зависимость, когда вы делаете mvn dependency:tree.Это объясняет, почему ваше исключение не работает.

Я бы порекомендовал взглянуть на плагин maven shade для упаковки вашей банки.Затем вы можете использовать фильтр для исключения зависимостей slf4j из coat-libs , используя фильтр .

Например, что-то вроде:

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.1.1</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <filters>
                <filter>
                  <artifact>org.jlab.coat:coat-libs</artifact>
                  <excludes>
                    <exclude>org/slf4j/**</exclude>
                  </excludes>
                </filter>
                <filter>
                  <artifact>*:*</artifact>
                  <excludes>
                    <exclude>META-INF/*.SF</exclude>
                    <exclude>META-INF/*.DSA</exclude>
                    <exclude>META-INF/*.RSA</exclude>
                  </excludes>
                </filter>
              </filters>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
0 голосов
/ 25 мая 2018

Так же, как в сообщении, вы получаете одну привязку от coat-libs-5.1-SNAPSHOT.jar, а другую привязку - slf4j-log4j12-1.7.16.jar.Дело не в том, что "coat-libs" пытается ввести зависимость, имеющую привязку, она является привязкой журналирования, которая пытается обрабатывать журналирование SLF4J.Вы можете использовать только одну привязку журналирования, поэтому вам нужно либо удалить использование coat-libs, либо исключить slf4j-log4j12 из зависимостей для spark-core, в зависимости от того, какую среду журналирования вы на самом деле пытаетесь использовать.

...