Java AbstractMethodError由于slf4j api和sl4j标记调用apacheds-all-1.5.5

Java AbstractMethodError由于slf4j api和sl4j标记调用apacheds-all-1.5.5,java,spring,logging,Java,Spring,Logging,我犯了一个著名的错误: java.lang.AbstractMethodError: ch.qos.logback.classic.Logger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;Ljava/lang/Throwable;)V at org.apache.commons.logging.impl.SLF4JLocationAwareLog.debug(SLF4JLocationAwareLog.java:120)

我犯了一个著名的错误:

java.lang.AbstractMethodError: ch.qos.logback.classic.Logger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;Ljava/lang/Throwable;)V
at org.apache.commons.logging.impl.SLF4JLocationAwareLog.debug(SLF4JLocationAwareLog.java:120)
在经历了许多SO问题后,以下是我的进展:

  • mvn.cmd dependency:tree-DskipTests | findstr/R/C:slf4j
    证明我在slf4j api jcl-over-slf4j上使用了相同版本的slf4j(1.5.5,由于以下原因,我不能使用更高版本)
  • 查找从中加载某些类的类路径,我们会看到以下结果:

    debugJars(org.slf4j.spi.LocationAwareLogger.class)
    
    debugJars(org.apache.commons.logging.impl.SLF4JLocationAwareLog.class)
    
    debugJars(org.slf4j.Marker.class)

    debugJars(ch.qos.logback.classic.Logger.class)

返回:

文件:/C:/Users/User/.m2/repository/org/apache/directory/server/apacheds-all/1.5.5/apacheds-all-1.5.5.jar/org/slf4j/spi/

文件:/C:/Users/User/.m2/repository/org/slf4j/jcl-over-slf4j/1.5.5/jcl-over-slf4j-1.5.5.jar/org/apache/commons/logging/impl/

文件:/C:/Users/User/.m2/repository/org/apache/directory/server/apacheds-all/1.5.5/apacheds-all-1.5.5.jar/org/slf4j/

文件:/C:/Users/User/.m2/repository/ch/qos/logback/logback classic/1.1.2/logback-classic-1.1.2.jar/ch/qos/logback/classic/

如何摆脱apacheds都会覆盖正确的sl4j依赖项这一事实


pom.xml不包含任何关于appacheds all dependency的内容我知道这可能是一个隐式依赖,但我如何解决这个问题?

我也使用相同的依赖,我没有面临任何问题 你能试试下面的吗

<org.slf4j-version>1.5.5</org.slf4j-version>

<!-- Logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${org.slf4j-version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${org.slf4j-version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${org.slf4j-version}</version>
            <scope>runtime</scope>
        </dependency>

<dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.15</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.mail</groupId>
                    <artifactId>mail</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.jms</groupId>
                    <artifactId>jms</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jdmk</groupId>
                    <artifactId>jmxtools</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jmx</groupId>
                    <artifactId>jmxri</artifactId>
                </exclusion>
            </exclusions>
            <scope>runtime</scope>
        </dependency>
1.5.5
org.slf4j
slf4j api
${org.slf4j版本}
org.slf4j
jcl-over-slf4j
${org.slf4j版本}
运行时
org.slf4j
slf4j-log4j12
${org.slf4j版本}
运行时
log4j
log4j
1.2.15
javax.mail
邮件
javax.jms
jms
com.sun.jdmk
jmxtools
com.sun.jmx
jmxri
运行时

我认为问题在于logback和slf4j之间存在一些依赖项版本不匹配,我会使用slf4j 1.7.25和logback classic 1.2.2,请参阅@RC来完成这项工作。我需要找到一种全局排除appached的方法,以加载其自己的slf4j版本(1.5.5)这是我不知道如何解决的问题,如下面的答案所示,您需要排除所有其他版本的slf4j(请参见您的
mvn.cmd dependency:tree
output)。它不起作用,自动添加新版本,您是否知道如何设置全局排除或阻止从apached库加载slf4j 1.5.5(它不包括在pom.xml中的任何位置)我现在已经更改了答案,希望它能起作用。