引入sentinel导致的multiple SLF4J bindings问题,写了exclusion不生效?

项目引入sentinel之后,启动报错multiple SLF4J bindings,写了exclusion,把slf4j排除后,依然报错,

<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <version>2.2.9.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
"C:\Program Files\Java\jdk1.8.0_301\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:58922,suspend=y,server=n -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -javaagent:C:\Users\issuser\AppData\Local\JetBrains\IntelliJIdea2022.3\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath C:\Users\issuser\AppData\Local\Temp\classpath839542257.jar com.haier.cosmo.im.base.Application
Connected to the target VM, address: '127.0.0.1:58922', transport: 'socket'
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/issuser/Desktop/suiwei/app/apache-maven-3.9.0/repository/ch/qos/logback/logback-classic/1.1.11/logback-classic-1.1.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/issuser/Desktop/suiwei/app/apache-maven-3.9.0/repository/org/slf4j/slf4j-log4j12/1.7.24/slf4j-log4j12-1.7.24.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
2024-05-11 21:07:29.148 [main] ERROR org.springframework.boot.SpringApplication - Application startup failed
java.lang.NoClassDefFoundError: org/springframework/boot/context/properties/source/ConfigurationPropertySources
    at org.springframework.cloud.client.HostInfoEnvironmentPostProcessor.getFirstNonLoopbackHostInfo(HostInfoEnvironmentPostProcessor.java:62)
    at org.springframework.cloud.client.HostInfoEnvironmentPostProcessor.postProcessEnvironment(HostInfoEnvironmentPostProcessor.java:51)
    at org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEnvironmentPreparedEvent(ConfigFileApplicationListener.java:171)
    at org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEvent(ConfigFileApplicationListener.java:157)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:167)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:122)
    at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:73)
    at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:54)
    at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:336)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151)
    at com.haier.cosmo.im.base.Application.main(Application.java:22)
Caused by: java.lang.ClassNotFoundException: org.springframework.boot.context.properties.source.ConfigurationPropertySources
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    ... 14 common frames omitted
Disconnected from the target VM, address: '127.0.0.1:58922', transport: 'socket'

Process finished with exit code 1
阅读 1k
2 个回答
✓ 已被采纳
Caused by: java.lang.ClassNotFoundException: org.springframework.boot.context.properties.source.ConfigurationPropertySources

明明是缺SpringBoot的包,slf4j表示这锅我不背

你这里一共有两个问题

1.SLF4J存在多个实现

  • logback的logback-classic-1.1.11.jar
  • log4j的slf4j-log4j12-1.7.24.jar

2.类找不到

  • java.lang.ClassNotFoundException: org.springframework.boot.context.properties.source.ConfigurationPropertySources

回答
1.确定你用的日志框架,排除另一个即可
很显然你项目除了sentinel,还有其他库依赖传递了slf4j-log4j12,必须在启动类所在pom文件中通过DependencyAnalyzer查找log4j,然后Exclude即可

2.如果项目能正常启动,那就是依赖冲突了,查看HostInfoEnvironmentPostProcessor.java:62文件中使用的org.springframework.boot.context.properties.source.ConfigurationPropertySources类包名与你引入的是不是同一个版本的库,可以将org.springframework.boot.context.properties.source.ConfigurationPropertySources复制在启动类的main方法上,看类实际是否存在,不存在,IDEA会提示你添加对应版本的依赖

如果不能启动,直接引入对应的starter,依赖不完整

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题