Spring Boot新项目启动报ClassNotFoundException: io.micrometer.tracing.Tracer
Spring Modulith + Actuator 项目启动报错:NoClassDefFoundError: io/micrometer/tracing/Tracer
我通过Spring Initializr创建了包含Spring Modulith和Spring Boot Actuator依赖的Spring Boot新项目,未做任何修改启动时出现如下错误:
:: Spring Boot :: (v3.2.2) 2024-02-17T23:26:15.088+01:00 INFO 10544 --- [ main] com.example.demo.DemoApplication : Starting DemoApplication using Java 21.0.1 with PID 10544 (D:\projects\demo\build\classes\java\main started by fabian in D:\projects\demo) 2024-02-17T23:26:15.090+01:00 INFO 10544 --- [ main] com.example.demo.DemoApplication : No active profile set, falling back to 1 default profile: "default" 2024-02-17T23:26:15.484+01:00 WARN 10544 --- [ main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: java.lang.IllegalStateException: Error processing condition on org.springframework.modulith.runtime.autoconfigure.SpringModulithRuntimeAutoConfiguration.modulithsApplicationRuntime 2024-02-17T23:26:15.492+01:00 INFO 10544 --- [ main] .s.b.a.l.ConditionEvaluationReportLogger : Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. 2024-02-17T23:26:15.505+01:00 ERROR 10544 --- [ main] o.s.boot.SpringApplication : Application run failed java.lang.IllegalStateException: Error processing condition on org.springframework.modulith.runtime.autoconfigure.SpringModulithRuntimeAutoConfiguration.modulithsApplicationRuntime at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:60) ~[spring-boot-autoconfigure-3.2.2.jar:3.2.2] at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:108) ~[spring-context-6.1.3.jar:6.1.3] at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod(ConfigurationClassBeanDefinitionReader.java:183) ~[spring-context-6.1.3.jar:6.1.3] at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:144) ~[spring-context-6.1.3.jar:6.1.3] at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:120) ~[spring-context-6.1.3.jar:6.1.3] at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:428) ~[spring-context-6.1.3.jar:6.1.3] at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:289) ~[spring-context-6.1.3.jar:6.1.3] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:349) ~[spring-context-6.1.3.jar:6.1.3] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:118) ~[spring-context-6.1.3.jar:6.1.3] at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:788) ~[spring-context-6.1.3.jar:6.1.3] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:606) ~[spring-context-6.1.3.jar:6.1.3] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-3.2.2.jar:3.2.2] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[spring-boot-3.2.2.jar:3.2.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:334) ~[spring-boot-3.2.2.jar:3.2.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354) ~[spring-boot-3.2.2.jar:3.2.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-3.2.2.jar:3.2.2] at com.example.demo.DemoApplication.main(DemoApplication.java:10) ~[main/:na] Caused by: java.lang.IllegalStateException: Failed to introspect Class [org.springframework.modulith.observability.autoconfigure.ModuleObservabilityAutoConfiguration] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@76ed5528] at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:483) ~[spring-core-6.1.3.jar:6.1.3] at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:360) ~[spring-core-6.1.3.jar:6.1.3] at org.springframework.util.ReflectionUtils.getUniqueDeclaredMethods(ReflectionUtils.java:417) ~[spring-core-6.1.3.jar:6.1.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.lambda$getTypeForFactoryMethod$1(AbstractAutowireCapableBeanFactory.java:749) ~[spring-beans-6.1.3.jar:6.1.3] at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1740) ~[na:na] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:748) ~[spring-beans-6.1.3.jar:6.1.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:681) ~[spring-beans-6.1.3.jar:6.1.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:652) ~[spring-beans-6.1.3.jar:6.1.3] at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1644) ~[spring-beans-6.1.3.jar:6.1.3] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:562) ~[spring-beans-6.1.3.jar:6.1.3] at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:534) ~[spring-beans-6.1.3.jar:6.1.3] at org.springframework.boot.autoconfigure.condition.OnBeanCondition.collectBeanNamesForType(OnBeanCondition.java:247) ~[spring-boot-autoconfigure-3.2.2.jar:3.2.2] at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getBeanNamesForType(OnBeanCondition.java:240) ~[spring-boot-autoconfigure-3.2.2.jar:3.2.2] at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getBeanNamesForType(OnBeanCondition.java:230) ~[spring-boot-autoconfigure-3.2.2.jar:3.2.2] at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getMatchingBeans(OnBeanCondition.java:183) ~[spring-boot-autoconfigure-3.2.2.jar:3.2.2] at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getMatchOutcome(OnBeanCondition.java:158) ~[spring-boot-autoconfigure-3.2.2.jar:3.2.2] at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:47) ~[spring-boot-autoconfigure-3.2.2.jar:3.2.2] ... 16 common frames omitted Caused by: java.lang.NoClassDefFoundError: io/micrometer/tracing/Tracer at java.base/java.lang.Class.getDeclaredMethods0(Native Method) ~[na:na] at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3578) ~[na:na] at java.base/java.lang.Class.getDeclaredMethods(Class.java:2676) ~[na:na] at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:465) ~[spring-core-6.1.3.jar:6.1.3] ... 32 common frames omitted Caused by: java.lang.ClassNotFoundException: io.micrometer.tracing.Tracer at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) ~[na:na] ... 36 common frames omitted Process finished with exit code 1
移除Spring Modulith或Actuator任一依赖即可启动成功,项目生成的build.gradle内容如下:
plugins { id 'java' id 'org.springframework.boot' version '3.2.2' id 'io.spring.dependency-management' version '1.1.4' } group = 'com.example' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } repositories { mavenCentral() } ext { set('springModulithVersion', "1.1.2") } dependencies { implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.modulith:spring-modulith-starter-core' runtimeOnly 'org.springframework.modulith:spring-modulith-actuator' runtimeOnly 'org.springframework.modulith:spring-modulith-observability' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.modulith:spring-modulith-starter-test' } dependencyManagement { imports { mavenBom "org.springframework.modulith:spring-modulith-bom:${springModulithVersion}" } } tasks.named('test') { useJUnitPlatform() }
预期项目能默认配置正常启动,请问我遗漏了什么?
问题根源
错误日志的核心是java.lang.NoClassDefFoundError: io/micrometer/tracing/Tracer,说明项目缺少Micrometer Tracing的相关类。
查看build.gradle可以发现,Initializr自动添加了spring-modulith-observability依赖,这个模块依赖Micrometer Tracing来实现可观测性,但Spring Boot Actuator的starter并不包含Micrometer Tracing的完整依赖,导致类缺失。
解决方案
有两种方式解决这个问题:
方案1:移除不需要的Observability依赖
如果你暂时不需要Spring Modulith的可观测性功能,可以直接删除spring-modulith-observability的依赖:
dependencies { implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.modulith:spring-modulith-starter-core' runtimeOnly 'org.springframework.modulith:spring-modulith-actuator' // 移除这一行 // runtimeOnly 'org.springframework.modulith:spring-modulith-observability' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.modulith:spring-modulith-starter-test' }
方案2:添加Micrometer Tracing依赖
如果你需要保留Observability功能,需要添加Micrometer Tracing的starter依赖:
dependencies { implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.modulith:spring-modulith-starter-core' runtimeOnly 'org.springframework.modulith:spring-modulith-actuator' runtimeOnly 'org.springframework.modulith:spring-modulith-observability' // 添加Micrometer Tracing starter implementation 'org.springframework.boot:spring-boot-starter-micrometer-tracing' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.modulith:spring-modulith-starter-test' }
添加后,项目就能正常启动,同时保留Modulith的可观测性功能。
内容的提问来源于stack exchange,提问作者Teharez
相关产品推荐
相关产品推荐

