当前位置: 首页 > 知识库问答 >
问题:

Maven SL4J多个绑定,以前的解决方案失败

赵超
2023-03-14

我有一个项目有多个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 dependency: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个答案

燕玉堂
2023-03-14

正如消息所说,您将从coat-libs-5.1-SNAPSHOT. jar中获得一个绑定,并在slf4j-log4j12-1.7.16.jar中获得另一个绑定。这并不是“coat-libs”试图引入具有绑定的依赖项,而是尝试处理SLF4J日志记录的日志绑定。您只能使用一个日志绑定,因此您要么需要删除coat-libs的使用,要么需要从spack-core的依赖项中排除slf4j-log4j12,具体取决于您实际尝试使用的日志框架。

彭华皓
2023-03-14

在我看来,coat libs被打包成了一个uber jar,这就是为什么当你做mvn dependency:tree时,slf4j不会显示为依赖项。这就解释了为什么你的排除不起作用。

我建议大家看看maven shade插件,它可以用来包装你的罐子。然后,可以使用过滤器从coat LIB中排除slf4j依赖项。

例如,可能是这样的:

  <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>
 类似资料:
  • 本文向大家介绍window.onload绑定多个事件的两种解决方案,包括了window.onload绑定多个事件的两种解决方案的使用技巧和注意事项,需要的朋友参考一下 前言 有些函数,必须在网页加载完毕后执行。比如:涉及DOM操作的。 网页加载完毕时会触发一个onload事件,将函数绑定到这个事件上即可。 问题来了:如果需要同时绑定多个事件,该如何处理呢?有两种解决方法 方案一 创建一个匿名函数,

  • 问题内容: 这听起来像是SE网站上的一堆类似的问题,所以我应该很冗长以阐明我的问题。因此,这是项目的最小内容: 这是Maven生成的依赖树。 : 现在,让我们删除排除并再次检查依赖项。我们会得到: 因此,正如我们所看到的,一切都按预期工作,并且实际上排除了冲突的依赖关系。但事实是,即使排除 了 依赖项,在编译和调用时我仍然收到以下消息: 问题是:为什么我仍然看到此警告?为使执行过程中只有一个版本的

  • 这个问题听起来像是SE网站上的一堆类似问题,所以我应该非常详细地说明我的问题。所以,这是项目的最小: 这是maven生成的依赖树。 : 现在,让我们删除排除并再次检查依赖项。我们将得到: 因此,正如我们所看到的,一切都按预期工作,并且实际上排除了冲突的依赖关系。但问题是,即使排除了依赖关系,我仍然在编译和调用时收到以下消息: 问题是:为什么我仍然看到这个警告,以及在执行过程中应该做些什么才能使sl

  • 问题内容: 包括我在内的一些人一直在努力将来自不同模块(jar)的实体合并到单个持久性单元中(尤其是 JavaSE ,例如此处的JPA 2.0:从不同的jar自动将实体类添加到PersistenceUnit中)。根据答案,没有简单直接的方法可以做到这一点。解决方案之一是在单个持久性单元文件中列出所有jar中的所有类,但这并不是很优雅。我可能不小心找到了另一种方法。通常,我所有的实体类都是使用 注释

  • 本文向大家介绍Hadoop SSH免密码登录以及失败解决方案,包括了Hadoop SSH免密码登录以及失败解决方案的使用技巧和注意事项,需要的朋友参考一下 1. 创建ssh-key 这里我们采用rsa方式,使用如下命令: 备注: 这里会提示输入pass phrase,一定不要输入任何字符,回车即可。 2. 生成authorized_keys文件 备注: 记得要把authorized_keys文件放

  • 本文向大家介绍jquery 新建的元素事件绑定问题解决方案,包括了jquery 新建的元素事件绑定问题解决方案的使用技巧和注意事项,需要的朋友参考一下 js的事件监听跟css不一样,css只要设定好了样式,不论是原来就有的还是新添加的,都有一样的表现。而事件监听不是,你必须给每一个元素单独绑定事件。 常见的例子是处理表格的时候。每行行末有个删除按钮,点了这个能够删除这一行。 通常,我会这么绑定 对