Gradle приводит неправильную версию транзитивной зависимости[java.lang.NoClassDefFoundError в Gradle]

#gradle #dependencies #classnotfoundexception

Вопрос:

У меня многопроектная сборка.

Один из его модулей X содержит зависимость B, содержащую переходную эластичную клиентскую зависимость:

     api (group: 'org.elasticsearch.client', name: 'elasticsearch-rest-high-level-client', version: 7.9.0) {
        exclude group: 'org.yaml', module: 'snakeyaml'
    }
 

У меня есть тесты внутри X, которые используют методы B, где я передаю эластичные клиентские классы в качестве аргументов.

X использует плагин Spring Boot Gradle.

Во время выполнения, во время выполнения интеграционных тестов, которые используют зависимость B для тестирования ES, я получаю это исключение(исходные классы замаскированы)

 Exception in thread "I/O dispatcher 4" java.lang.NoClassDefFoundError: org/elasticsearch/cluster/metadata/AliasMetadata
        at dependencyB.myESService.index
        at io.reactivex.internal.operators.single.SingleMap$MapSingleObserver.onSuccess(SingleMap.java:57)
        at io.reactivex.internal.operators.single.SingleDoOnSuccess$DoOnSuccess.onSuccess(SingleDoOnSuccess.java:60)
        at io.reactivex.internal.operators.single.SingleResumeNext$ResumeMainSingleObserver.onSuccess(SingleResumeNext.java:65)
        at io.reactivex.internal.operators.single.SingleFlatMap$SingleFlatMapCallback$FlatMapSingleObserver.onSuccess(SingleFlatMap.java:111)
        at io.reactivex.internal.operators.single.SingleCreate$Emitter.onSuccess(SingleCreate.java:67)
...
        at org.elasticsearch.client.RestHighLevelClient$1.onSuccess(RestHighLevelClient.java:1663)
        at org.elasticsearch.client.RestClient$FailureTrackingResponseListener.onSuccess(RestClient.java:590)
        at org.elasticsearch.client.RestClient$1.completed(RestClient.java:333)
        at org.elasticsearch.client.RestClient$1.completed(RestClient.java:327)
        at org.apache.http.concurrent.BasicFuture.completed(BasicFuture.java:122)
        at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.responseCompleted(DefaultClientExchangeHandlerImpl.java:181)
        at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.processResponse(HttpAsyncRequestExecutor.java:448)
        at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.inputReady(HttpAsyncRequestExecutor.java:338)
        at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:265)
        at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81)
        at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39)
        at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:114)
        at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162)
        at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337)
        at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
        at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276)
        at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
        at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591)
        at java.base/java.lang.Thread.run(Thread.java:834)
    Caused by: java.lang.ClassNotFoundException: org.elasticsearch.cluster.metadata.AliasMetadata
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        ... 27 more
 

Я не использую конфликтующий класс напрямую.

Зависимости задач Gradle дали мне подсказку(замаскированные внутренние версии и имена).

  --- org.path:dependencyB:123
|     --- org.path:another-lib:123 (*)
|     --- org.path:third-lib:123 (*)
|    --- **org.elasticsearch.client:elasticsearch-rest-high-level-client:7.9.0 -> 7.6.2**
 

Насколько я понимаю, версия 7.6.2 клиента ES используется вместо 7.9.0 , и это вызывает проблему.

Я понятия не имею, почему это происходит — насколько я понимаю, клиент не извлекается ни из какого другого места, и для версий зависимостей нет пользовательских правил.

Прав ли я и как это исправить? Какие-нибудь намеки? Есть какие-нибудь идеи?

Комментарии:

1. Вы используете плагин управления зависимостями Spring ?

2. Да………… путь к классу «org.springframework.boot:spring-boot-gradle-плагин:2.3.5.ВЫПУСК пути к классу «io.spring.gradle:плагин для управления зависимостями:1.0.11.ВЫПУСК»

3. Возможно, необходимо полное дерево зависимостей.