maven 如何解决-提供程序org.slf4j.simple.SimpleServiceProvider不是子类型?

juud5qan  于 2022-11-22  发布在  Maven
关注(0)|答案(1)|浏览(219)

我将slf4j.simple的依赖版本从1.6.0更改为2.0.0alpha1,并在运行mvn clean install命令时遇到此错误-

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>2.0.0-alpha1</version>
    <scope>provided</scope>
</dependency>

堆栈跟踪-

Error during instantiation of the implementation object
java.util.ServiceConfigurationError: org.slf4j.spi.SLF4JServiceProvider: Provider org.slf4j.simple.SimpleServiceProvider not a subtype
        at java.util.ServiceLoader.fail(ServiceLoader.java:239)
        at java.util.ServiceLoader.access$300(ServiceLoader.java:185)
        at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:376)
        at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
        at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
        at org.slf4j.LoggerFactory.findServiceProviders(LoggerFactory.java:104)
        at org.slf4j.LoggerFactory.bind(LoggerFactory.java:147)
        at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:139)
        at org.slf4j.LoggerFactory.getProvider(LoggerFactory.java:418)
        at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:404)
        at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:353)
        at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:379)
ktca8awb

ktca8awb1#

在我的例子中,这个错误是由SLF4J 2.0在ThreadContextClassLoader中搜索org.slf4j.spi.SLF4JServiceProvider的示例引起的,ThreadContextClassLoader默认设置为Application类加载器。不幸的是,我的代码实际上是在一个 * 完全独立的 * 类加载器中运行的,它包含自己的slf4j-apislf4j-simple示例。
最重要的是,我的隔离类加载器中的slf4j-api在Application类加载器中找到了slf4j-simple,它不能分配给服务接口(即“不是子类型”)。
在代码执行LoggerFactory.getLogger(clazz)之前,我通过正确设置ThreadContextClassLoader解决了这个问题。
不过我个人认为这是SLF4J使用ServiceLoader时的一个bug。具体来说,LoggerFactory.findServiceProviders()应该使用:

ServiceLoader.load(SLF4JServiceProvider.class, LoggerFactory.class.getClassLoader())

代替

ServiceLoader.load(SLF4JServiceProvider.class)

相关问题