升级spring-kafka-test至2.4.13.RELEASE时EmbeddedKafkaBroker报错
解决spring-kafka-test升级后
LogAccessor类找不到的问题 问题背景
之前使用spring-kafka-test 2.1.4.RELEASE搭配KafkaEmbedded组件,升级spring-kafka-test到2.4.13.RELEASE时,迁移至EmbeddedKafkaBroker并使用@EmbeddedKafka注解,出现如下错误:
java.lang.NoClassDefFoundError: org/springframework/core/log/LogAccessor at org.springframework.kafka.test.EmbeddedKafkaBroker.<clinit>(EmbeddedKafkaBroker.java:92) at org.springframework.kafka.test.context.EmbeddedKafkaContextCustomizer.customizeContext(EmbeddedKafkaContextCustomizer.java:71) at org.springframework.boot.test.context.SpringBootContextLoader$ContextCustomizerAdapter.initialize(SpringBootContextLoader.java:336) at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:626) at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:366) at org.springframework.boot.SpringApplication.run(SpringApplication.java:325) at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:138) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:117) at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:107) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:242) at org.springframework.test.context.testng.AbstractTestNGSpringContextTests.springTestContextPrepareTestInstance(AbstractTestNGSpringContextTests.java:145) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85) at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:510) at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:211) at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:138) at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:170) at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:104) at org.testng.TestRunner.privateRun(TestRunner.java:774) at org.testng.TestRunner.run(TestRunner.java:624) at org.testng.SuiteRunner.runTest(SuiteRunner.java:359) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:354) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:312) at org.testng.SuiteRunner.run(SuiteRunner.java:261) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1215) at org.testng.TestNG.runSuitesLocally(TestNG.java:1140) at org.testng.TestNG.run(TestNG.java:1048) at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66) at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109) Caused by: java.lang.ClassNotFoundException: org.springframework.core.log.LogAccessor at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) 37 more
当前环境:spring-boot-starter-parent 2.0.0.RELEASE,spring-kafka 2.1.4.RELEASE,已尝试过不同版本的spring-kafka-test。
错误原因
org.springframework.core.log.LogAccessor是Spring Core 5.1及以上版本才新增的类,而spring-boot-starter-parent 2.0.0.RELEASE对应的Spring Core版本为5.0.x,版本不匹配导致找不到该类。spring-kafka与spring-kafka-test版本不一致(2.1.4 vs 2.4.13),进一步加剧了依赖兼容性问题。
解决方案
方案一:统一升级Spring Boot与Kafka相关依赖(推荐)
将Spring Boot版本升级至与spring-kafka-test 2.4.13.RELEASE兼容的版本,同时同步升级spring-kafka版本,保证依赖版本一致:
- 修改
pom.xml中的父依赖版本为2.2.x(spring-kafka 2.4.x对应Spring Boot 2.2.x官方适配):<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.13.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> - 同步调整
spring-kafka与spring-kafka-test版本一致:<dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>2.4.13.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka-test</artifactId> <version>2.4.13.RELEASE</version> <scope>test</scope> </dependency> - 验证
@EmbeddedKafka与EmbeddedKafkaBroker的使用,此时Spring Core版本已升级至5.2.x,包含LogAccessor类,可解决错误。
方案二:降低spring-kafka-test版本适配现有Spring Boot
如果无法升级Spring Boot,需将spring-kafka-test版本降至与spring-boot-starter-parent 2.0.0.RELEASE及spring-kafka 2.1.4.RELEASE兼容的2.1.x系列,但此版本仍使用KafkaEmbedded而非EmbeddedKafkaBroker:
<dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka-test</artifactId> <version>2.1.4.RELEASE</version> <scope>test</scope> </dependency>
注意:此方案无法使用EmbeddedKafkaBroker,若必须使用该组件,只能选择方案一升级Spring Boot。
内容的提问来源于stack exchange,提问作者Charles Antony Raja
相关产品推荐
相关产品推荐

