类路径包含多个 SLF4J 绑定,即使有排除项

Posted

技术标签:

【中文标题】类路径包含多个 SLF4J 绑定,即使有排除项【英文标题】:Class path contains multiple SLF4J bindings even with exclusions 【发布时间】:2017-02-27 18:31:58 【问题描述】:

我正在 Jenkins 上部署应用程序,我收到了 Multiple bindings error

我已经尝试在我的 pom.xml 中添加排除项。然后我运行 maven dependency:tree 命令来跟踪是否有任何其他依赖项正在使用 logback 并且没有对此的引用。这是运行此命令logs 后的日志。奇怪的是,在我的本地机器上,应用程序构建并成功启动。这是我最新的 pom.xml:

<modules>
    <module>my-first-module</module>
    <module>my-second-module</module>
</modules>

<properties>
    <springboot.version>1.4.1.RELEASE</springboot.version>
    <postgresql.version>9.4-1200-jdbc41</postgresql.version>
    <hsqldb.version>1.8.0.10</hsqldb.version>
    <h2.version>1.4.192</h2.version>
    <junit.version>4.12</junit.version>
    <jwt.version>0.6.0</jwt.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <spring.security>4.1.3.RELEASE</spring.security>
</properties>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.1.RELEASE</version>
</parent>

<dependencyManagement>
    <dependencies>
        <!--spring-boot-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
            <version>$springboot.version</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>$springboot.version</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-classic</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>$springboot.version</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-classic</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>$springboot.version</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-classic</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
            <version>$spring.security</version>
        </dependency>
        <!--JWT-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>$jwt.version</version>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.10</version>
            <scope>provided</scope>
        </dependency>
        <!--common-module-->
        <dependency>
            <groupId>com.soft.pgs</groupId>
            <artifactId>common</artifactId>
            <version>0.1.0-SNAPSHOT</version>
        </dependency>
        <!--mapper-->
        <dependency>
            <groupId>org.modelmapper</groupId>
            <artifactId>modelmapper</artifactId>
            <version>0.7.5</version>
        </dependency>
        <!--HSQL-->
        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <version>$hsqldb.version</version>
            <scope>test</scope>
        </dependency>
        <!--H2-->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>$h2.version</version>
            <scope>runtime</scope>
        </dependency>
        <!--test-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>$junit.version</version>
        </dependency>
        <!--swagger-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.4.0</version>
        </dependency>
    </dependencies>
</dependencyManagement>

我什至尝试过一些愚蠢的事情,比如在每个 pom 中为每个依赖项添加排除项,但仍然没有任何更改。

           <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-classic</artifactId>
                </exclusion>
            </exclusions>

我也试过这个排除:

          <exclusions>
              <exclusion> 
                  <groupId>org.slf4j</groupId>
                  <artifactId>slf4j-log4j12</artifactId>
              </exclusion>
              <exclusion> 
                  <groupId>log4j</groupId>
                  <artifactId>log4j</artifactId>
              </exclusion>
          </exclusions> 

甚至这两者结合在一起。我不知道还有什么其他选择,如果有人有任何想法,我将不胜感激,谢谢。

还添加了此question 的排除项,但仍然没有更改。

【问题讨论】:

Spring + PostgreSQL > Multiple SLF4J bindings的可能重复 看来 PostgreSQL 的 slf4j-simple 依赖是这里的罪魁祸首。我认为您应该从 com.soft.pgs:common 中排除 slf4j-simple,而不是试图排除 logback。我在之前的评论中链接的答案完全相同。 我注意到您更改了问题并提到链接答案中的排除项不起作用。您现在可以发布您当前的 pom.xml 并显示您更新的 mvn 依赖项:tree 吗? 对于初学者,我会清理你的 pom,然后执行 mvn dependency:tree 并查看哪个依赖项拉入了罪魁祸首,而不是随机排除事物 【参考方案1】:

我遇到了同样的问题,但是当我添加 swagger-codegen-maven-plugin 时它开始发生,在创建 mvn dependency:tree 之后我发现他们也有 slf4j-simple-1.7.30.jar。然后我添加了排除:

<dependency>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-codegen-maven-plugin</artifactId>
    <version>2.3.1</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
        </exclusion>
    </exclusions>
</dependency>

【讨论】:

以上是关于类路径包含多个 SLF4J 绑定,即使有排除项的主要内容,如果未能解决你的问题,请参考以下文章

SLF4J:类路径包含多个 SLF4J 绑定

如何在 Play 2.3.x 启动时修复“SLF4J:类路径包含多个 SLF4J 绑定”?

SLF4J:类路径包含多个 SLF4J 绑定 slf4j-test vs logback-classic

多个 SLF4J 绑定 activemq-all-5.6.0.jar 出错

全文搜索,包含多个确切的短语和排除项

java 一个实用程序类,它帮助我仅使用包含和排除来创建复杂的正则表达式路径。