由于 MongoMetricsConnectionPoolListener 冲突,如何解决 karate-core 无法与 spring boot 2.5.0 一起工作的问题

How to fix issue with karate-core not working with spring boot 2.5.0 due to clash MongoMetricsConnectionPoolListener

我有一个 spring 引导项目,它使用我正在使用空手道测试的执行器。我最近尝试将我的项目从使用 spring boot 2.4.5 更新到 2.5.0。由于进行了更改,我的测试现在失败并出现以下错误:

    
    ***************************
    APPLICATION FAILED TO START
    ***************************
    
    Description:
    
    An attempt was made to call a method that does not exist. The attempt was made from the following location:
    
        org.springframework.boot.actuate.autoconfigure.metrics.mongo.MongoMetricsAutoConfiguration$MongoConnectionPoolMetricsConfiguration.mongoMetricsConnectionPoolListener(MongoMetricsAutoConfiguration.java:91)
    
    The following method did not exist:
    
        'void io.micrometer.core.instrument.binder.mongodb.MongoMetricsConnectionPoolListener.<init>(io.micrometer.core.instrument.MeterRegistry, io.micrometer.core.instrument.binder.mongodb.MongoConnectionPoolTagsProvider)'
    
    The method's class, io.micrometer.core.instrument.binder.mongodb.MongoMetricsConnectionPoolListener, is available from the following locations:
    
        jar:file:/Users/michaelruocco/.gradle/caches/modules-2/files-2.1/com.intuit.karate/karate-core/1.0.1/3f16197bf259d591cc73df52de7aa0a0fb4f2db6/karate-core-1.0.1.jar!/io/micrometer/core/instrument/binder/mongodb/MongoMetricsConnectionPoolListener.class
        jar:file:/Users/michaelruocco/.gradle/caches/modules-2/files-2.1/io.micrometer/micrometer-core/1.7.0/bc7dc1605f2099dc3c39156b7f62ac889f54fb67/micrometer-core-1.7.0.jar!/io/micrometer/core/instrument/binder/mongodb/MongoMetricsConnectionPoolListener.class
    
    The class hierarchy was loaded from the following locations:
    
        io.micrometer.core.instrument.binder.mongodb.MongoMetricsConnectionPoolListener: file:/Users/michaelruocco/.gradle/caches/modules-2/files-2.1/com.intuit.karate/karate-core/1.0.1/3f16197bf259d591cc73df52de7aa0a0fb4f2db6/karate-core-1.0.1.jar
        com.mongodb.event.ConnectionPoolListenerAdapter: file:/Users/michaelruocco/.gradle/caches/modules-2/files-2.1/org.mongodb/mongo-java-driver/3.12.8/d9e12b2056cea964a3805558382e0d30596444c5/mongo-java-driver-3.12.8.jar
    
    
    Action:
    
    Correct the classpath of your application so that it contains a single, compatible version of io.micrometer.core.instrument.binder.mongodb.MongoMetricsConnectionPoolListener

查看 karate-core-1.0 的内容。1.jar 它有这些千分尺的副本 类 在 jar 本身内有阴影,而不是将它们作为依赖项拉出,这意味着有我无法在我的 gradle 文件中排除这种依赖关系。我还可以看到这些 类 在这里被故意加了阴影:https://github.com/intuit/karate/blob/master/karate-core/pom.xml#L203.

Spring boot 2.4.5 actuator 正在使用micrometer-core版本:1.6.6 Spring boot 2.5.0 actuator 正在使用 micrometer-core 版本:1.7.0

所以我预计问题是这两个版本之间的重大变化导致了这个问题。为了让 karate-core 与 spring-boot 2.5.0 完美搭配,我需要一个与 micrometer-core 1.7.0 兼容的 karate-core 版本。我看不到 karate-core 本身对千分尺的任何直接依赖,所以我猜它可能是传递性地拉动它?

我也试图排除致动器引入的千分尺核心依赖性,但这会破坏致动器的功能,导致:

     Caused by: java.lang.IllegalStateException: @ConditionalOnMissingBean did not specify a bean using type, name or annotation and the attempt to deduce the bean's type failed
        at org.springframework.boot.autoconfigure.condition.OnBeanCondition$Spec.validate(OnBeanCondition.java:487)
        at org.springframework.boot.autoconfigure.condition.OnBeanCondition$Spec.<init>(OnBeanCondition.java:436)
        at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getMatchOutcome(OnBeanCondition.java:142)
        at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:47)
        ... 113 more
      Caused by: org.springframework.boot.autoconfigure.condition.OnBeanCondition$BeanTypeDeductionException: Failed to deduce bean type for org.springframework.boot.actuate.autoconfigure.metrics.mongo.MongoMetricsAutoConfiguration$MongoConnectionPoolMetricsConfiguration.mongoConnectionPoolTagsProvider
        at org.springframework.boot.autoconfigure.condition.OnBeanCondition$Spec.deducedBeanTypeForBeanMethod(OnBeanCondition.java:517)
        at org.springframework.boot.autoconfigure.condition.OnBeanCondition$Spec.deducedBeanType(OnBeanCondition.java:506)
        at org.springframework.boot.autoconfigure.condition.OnBeanCondition$Spec.<init>(OnBeanCondition.java:429)
        ... 115 more
      Caused by: java.lang.ClassNotFoundException: io.micrometer.core.instrument.binder.mongodb.MongoConnectionPoolTagsProvider
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:606)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:468)
        at org.springframework.boot.autoconfigure.condition.FilteringSpringBootCondition.resolve(FilteringSpringBootCondition.java:108)
        at org.springframework.boot.autoconfigure.condition.OnBeanCondition$Spec.getReturnType(OnBeanCondition.java:525)
        at org.springframework.boot.autoconfigure.condition.OnBeanCondition$Spec.deducedBeanTypeForBeanMethod(OnBeanCondition.java:513)
        ... 117 more

是否有计划创建可与 spring boot 2.5.0 一起使用的 karate-core 版本?或者有人对我如何解决这个问题有任何其他建议吗?

是的,我们当然从未预料到这一点。我们可能不得不考虑为团队发布一个单独的“非阴影”工件。

欢迎提出问题,我们会进行调查。当然,如果你能做出贡献,那就更好了。

你暂时可以试试这个,让我知道进展如何。我认为您应该能够在本地创建自己的 JAR 并使用 maven-shade 从 karate fat-jar 中移除千分尺。然后在您的项目中使用该依赖项。我想不出别的了。