#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. Возможно, необходимо полное дерево зависимостей.