【问题标题】:NoClassDefFoundError: scala/math/Ordering with spring-kafka-test 2.5.7NoClassDefFoundError: scala/math/Ordering with spring-kafka-test 2.5.7
【发布时间】:2021-02-16 11:52:24
【问题描述】:

我有一个小型库,它提供围绕 EmbeddedKafkaBroker 的 JUnit 5 扩展,它试图通过在测试之间将偏移量重置为最新而不是丢弃整个上下文,从而比仅使用 @DirtiesContext 具有更高的性能。

我的 build.gradle 是:

import org.springframework.boot.gradle.plugin.SpringBootPlugin

plugins {
    id 'org.springframework.boot' version '2.3.5.RELEASE' apply false
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
}

dependencyManagement {
    imports {
        mavenBom SpringBootPlugin.BOM_COORDINATES
    }
}

sourceCompatibility = '1.8'

dependencies {
    implementation 'org.junit.jupiter:junit-jupiter-api'
    implementation 'org.springframework.kafka:spring-kafka'
    implementation 'org.springframework.kafka:spring-kafka-test'
    compileOnly 'org.springframework.integration:spring-integration-core'

    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testRuntime 'org.springframework.integration:spring-integration-core'
    testRuntime 'org.junit.jupiter:junit-jupiter-engine'
}

这解决了使用spring-kafka:2.5.72.12 的各种Scala 库。当扩展程序尝试启动 EmbeddedKafkaBroker 时,出现以下异常:

java.lang.NoClassDefFoundError: scala/math/Ordering$$anon$7

    at kafka.api.ApiVersion$.orderingByVersion(ApiVersion.scala:45)
    at kafka.api.ApiVersion.compare(ApiVersion.scala:139)
    at kafka.api.ApiVersion.compare$(ApiVersion.scala:138)
    at kafka.api.KAFKA_2_5_IV0$.compare(ApiVersion.scala:339)
    at kafka.api.KAFKA_2_5_IV0$.compare(ApiVersion.scala:339)
    at scala.math.Ordered.$greater$eq(Ordered.scala:91)
    at scala.math.Ordered.$greater$eq$(Ordered.scala:91)
    at kafka.api.KAFKA_2_5_IV0$.$greater$eq(ApiVersion.scala:339)
    at kafka.server.KafkaConfig.<init>(KafkaConfig.scala:1561)
    at kafka.server.KafkaConfig.<init>(KafkaConfig.scala:1269)
    at org.springframework.kafka.test.EmbeddedKafkaBroker.afterPropertiesSet(EmbeddedKafkaBroker.java:313)

到目前为止,我所做的搜索只发现了覆盖特定 kafka 或 scala 版本的问题,我没有这样做。任何想法我缺少什么,或者如何解决它?

【问题讨论】:

    标签: java spring scala spring-kafka


    【解决方案1】:

    我也有同样的问题。我查看了 Spring Boot 2.3.5 使用的 spring-kafka 2.5.7.RELEASE,并在我的项目中添加了相同的 scala 依赖项作为我的 build.gradle 的解决方法:

    dependencies {
        ...
        testImplementation("org.scala-lang:scala-library:2.12.11")
    }
    

    这暂时解决了我的问题。希望它会在下一个 spring-kafka 版本中得到修复。

    【讨论】:

    • 这是一个已知问题 - 这是由于 Boot 规定的 Jackson 版本引入了不兼容的 scala 库。有关详细信息,请参阅 github.com/spring-projects/spring-kafka/issues/1604github.com/spring-projects/spring-boot/issues/23979。您的“解决方法”是正确的解决方案;我们无能为力 - 责怪 scala 人员在错误修复版本中做出如此激进的更改。
    • 另一种解决方案是升级到spring-kafka 2.6.3 和kafka-clients 2.6.0。您可以通过升级到 Boot 2.4.0 或使用 Boot 2.3.x docs.spring.io/spring-kafka/docs/current/reference/html/… 覆盖依赖项来做到这一点
    • 'org.springframework.boot:spring-boot-starter-parent:2.4.3', 'org.springframework.kafka:spring-kafka:2.5.8.RELEASE', 'org.springframework .kafka:spring-kafka-test:2.5.8.RELEASE','org.apache.kafka',名称:'kafka-clients',版本:'2.5.1','org.apache.kafka:kafka_2.12 :2.5.1:test', 'org.scala-lang:scala-library:2.12.11' 这些依赖也可以工作
    猜你喜欢
    • 2020-10-09
    • 1970-01-01
    • 2020-04-28
    • 2022-01-15
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    相关资源
    最近更新 更多