嵌入式Kafka 测试因 java.lang.NoSuchFieldError: id 失败

问题描述 投票:0回答:1

将组件从 Spring Boot 2.7.18 升级到 Spring Boot 3.2.2 时,我们看到所有 spring-kafka EmbeddedKafka 测试均失败,并出现以下 Spring 初始化错误:

java.lang.NoSuchFieldError: id

                at kafka.server.Defaults$.<clinit>(KafkaConfig.scala:187) ~[kafka_2.13-3.6.1.jar:na]

                at kafka.server.KafkaConfig$.<clinit>(KafkaConfig.scala:746) ~[kafka_2.13-3.6.1.jar:na]

                at kafka.server.KafkaConfig.DeleteTopicEnableProp(KafkaConfig.scala) ~[kafka_2.13-3.6.1.jar:na]

                at org.springframework.kafka.test.EmbeddedKafkaKraftBroker.addDefaultBrokerPropsIfAbsent(EmbeddedKafkaKraftBroker.java:256) ~[spring-kafka-test-3.1.1.jar:3.1.1]

                at org.springframework.kafka.test.EmbeddedKafkaKraftBroker.afterPropertiesSet(EmbeddedKafkaKraftBroker.java:202) ~[spring-kafka-test-3.1.1.jar:3.1.1]

                at org.springframework.kafka.test.context.EmbeddedKafkaContextCustomizer.customizeContext(EmbeddedKafkaContextCustomizer.java:130) ~[spring-kafka-test-3.1.1.jar:3.1.1]

                at org.springframework.boot.test.context.SpringBootContextLoader$ContextCustomizerAdapter.initialize(SpringBootContextLoader.java:442) ~[spring-boot-test-3.2.2.jar:3.2.2]

                at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:627) ~[spring-boot-3.2.2.jar:3.2.2]

                at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:400) ~[spring-boot-3.2.2.jar:3.2.2]

                at org.springframework.boot.SpringApplication.run(SpringApplication.java:333) ~[spring-boot-3.2.2.jar:3.2.2]

                at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:137) ~[spring-boot-test-3.2.2.jar:3.2.2]

                at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) ~[spring-core-6.1.3.jar:6.1.3]

                at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) ~[spring-core-6.1.3.jar:6.1.3]

                at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1454) ~[spring-boot-3.2.2.jar:3.2.2]

                at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:552) ~[spring-boot-test-3.2.2.jar:3.2.2]

有人见过这个或对如何解决它有任何建议吗?

从堆栈跟踪中,我们看到它找不到“id”字段。

但不确定这个“id”是什么。

如何对调用 scala 代码的 spring-kafka 代码进行故障排除? Intellij 控制台中的行号似乎没有映射到实际的 scala 代码。

Spring Boot 2.7.18 使用的原始版本: spring-kafka 2.9.13,kafka-clients 3.2.3

Spring Boot 3.2.2使用的版本: spring-kafka 3.1.1,kafka-clients 3.6.1

这里是 Spring Boot 3.2.2 所使用的依赖项/版本的列表。

dependencies {

    api platform (group: 'org.springframework.boot', name: 'spring-boot-dependencies', version: "3.2.2")

 

    api (group: 'org.springframework.boot', name: 'spring-boot-configuration-processor')

    api (group: 'org.springframework.boot', name: 'spring-boot-starter-actuator')

    api (group: 'org.springframework.boot', name: 'spring-boot-starter-data-jdbc')

    api (group: 'org.springframework.boot', name: 'spring-boot-starter-json')

    api (group: 'org.springframework.boot', name: 'spring-boot-starter-web')

    api (group: 'org.springframework.boot', name: 'spring-boot-starter-security')

    api (group: 'org.springframework.kafka', name: 'spring-kafka')

 

    api (group: 'com.google.guava', name: 'guava', version: '33.0.0-jre')

    api (group: 'com.sapiens.bdms', name: 'bdms-java-exe-helper', version: '7.1')

    api (group: 'jakarta.validation', name: 'jakarta.validation-api', version: '3.0.2')

    api (group: 'org.ehcache', name: 'ehcache', version: '3.10.8')

    api (group: 'org.apache.avro', name: 'avro', version: '1.11.3')

    api (group: 'org.apache.httpcomponents.client5', name: 'httpclient5', version: '5.3')

    api (group: 'org.hibernate.validator', name: 'hibernate-validator', version: '8.0.1.Final')

 

    api (group: 'redis.clients', name: 'jedis', version: '5.1.0')

 

    implementation (group: 'org.apache.tika', name: 'tika-core', version: '2.9.1')

 

    // lombok

    implementation (group: 'org.projectlombok', name: 'lombok', version: "1.18.30")

    annotationProcessor (group: 'org.projectlombok', name: 'lombok', version: "1.18.30")

    testImplementation (group: 'org.projectlombok', name: 'lombok', version: "1.18.30")

    testAnnotationProcessor (group: 'org.projectlombok', name: 'lombok', version: "1.18.30")

 

    testImplementation (group: 'com.h2database', name: 'h2')

    testImplementation (group: 'org.wiremock', name: 'wiremock', version: '3.3.1'){

        exclude group: 'org.slf4j', module: 'slf4j-api'

    }

    testImplementation (group: 'io.confluent', name: 'kafka-avro-serializer', version: '7.5.1')

    testImplementation (group: 'io.micrometer', name: 'micrometer-registry-prometheus', version: '1.12.1')

    testImplementation (group: 'it.ozimov', name: 'embedded-redis', version: '0.7.3'){

        exclude group: 'org.slf4j', module: 'slf4j-simple'

    }

    testImplementation (group: 'org.awaitility', name: 'awaitility', version: '4.2.0')

    testImplementation (group: 'jakarta.el', name: 'jakarta.el-api', version: '5.0.1')

    testImplementation (group: 'org.springframework.boot', name: 'spring-boot-starter-test')

    testImplementation (group: 'org.springframework.kafka', name: 'spring-kafka-test')

    testImplementation (group: 'org.springframework.boot', name: 'spring-boot-starter-aop')

    testImplementation (group: 'junit', name: 'junit', version: '4.13.2')

 

    testImplementation('org.scala-lang:scala3-library_3:3.3.1')

}

 

我们在 Spring Boot 3.2.2 上还有其他组件成功运行了 EmbeddedKafka 测试。

我比较了依赖树,但尚未找到会导致 NoSuchFieldError 的差异。

spring-kafka spring-kafka-test embedded-kafka nosuchfieldexception
1个回答
0
投票

这是由于依赖项配置错误造成的。换句话说,就

spring-kafka
而言,主要依赖项(例如
kafka-clients
)所依赖的任何内容都不匹配。

我在设置

embedded-kafka-schema-registry
依赖项时遇到了这个问题(并不完全是你一直在做的事情),但解释是一样的。

我该如何解释这个错误:

java.lang.NoSuchFieldError: id
,你猜?

查看堆栈跟踪显示了这种依赖项不匹配的副作用。

代码中的

kafka.server.Defaults$.<clinit>(KafkaConfig.scala:187) ~[kafka_2.13-3.6.1.jar:na]
行是这行

val OffsetsTopicCompressionCodec: Int = OffsetConfig.DefaultOffsetsTopicCompressionType.id

你能看到这个吗

id
?这就是
OffsetConfig.DefaultOffsetsTopicCompressionType
所指向的内容(来自不匹配的版本)所缺少的内容。

这一切都在

kafka
主要依赖项内(
scala/kafka/server/KafkaConfig.scala
所在的地方)。这是依赖项之一(也许甚至在传递性依赖项中=您没有明确指定)。

另一个依赖项是具有 CompressionType 类的依赖项。这是

kafka-clients

kafka-clients 必须与核心 Kafka 库 (kafka) API 兼容,这样它们就可以一起工作,否则……你会遇到这个讨厌的

java.lang.NoSuchFieldError: id
错误。

© www.soinside.com 2019 - 2024. All rights reserved.