bugfix> apache-spark > 投稿

複数の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>

そして、mvndependency:treeでは、除外jarのこの依存関係は表示されず、Spark jarのみ、つまり

[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 件
  • coat-libs のように見える  uber jarとしてパッケージ化されているため、 mvn dependency:tree を実行するとslf4jが依存関係として表示されない 。これは、除外が機能しない理由を説明しています。

    jarをパッケージ化するためのMavenシェードプラグインをご覧になることをお勧めします。次に、フィルターを使用して、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>
    
    

  • メッセージに書かれているように、 coat-libs-5.1-SNAPSHOT.jar から1つのバインディングを取得しています 、および slf4j-log4j12-1.7.16.jar の別のバインディング 。 「coat-libs」がバインディングを持つ依存関係を持ち込もうとしているのではなく、 SLF4Jロギングを処理しようとしているロギングバインディング。使用できるロギングバインディングは1つだけです。したがって、実際に使用しようとしているロギングフレームワークに応じて、coat-libsの使用を削除するか、spark-coreの依存関係からslf4j-log4j12を除外する必要があります。

あなたの答え