Как исправить ошибки, вызванные двумя одинаковыми банками с одинаковыми именами, но разными версиями? - PullRequest
0 голосов
/ 07 января 2019

В проекте есть два модуля: данные и инфраструктура.

  1. Модуль данных использует подключаемый модуль grpc, предоставленный Google: grpc-protobuf, который ссылается на com.google.guava: guava [версия: 26.0-android].

  2. Модуль инфраструктуры использует плагин консула: consul-client, который ссылается на com.google.guava: guava [версия: 22.0].

А модуль данных зависит от модуля инфраструктуры.

Нет проблем во время компиляции, но во время выполнения ConsulCache в консул-клиенте вызывает метод Stopwatch.elapsed () в com.google.guava: guava, который не является аргументом в com.google.guava: guava: 22.0 и параметрический в com.google.guava: guava: 26.0-android. ConsulCache всегда указывает на com.google.guava: guava: 26.0-android, а не com.goog.guava: guava: 22.0, который выдаст следующее исключение:

java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.elapsed()Ljava/time/Duration;
at com.orbitz.consul.cache.ConsulCache$1.onComplete(ConsulCache.java:103)

Поскольку это проект maven, и все дело в автоматическом управлении jar-пакетами, на него автоматически ссылаются сторонние плагины.

Как исправить это исключение без изменения исходного кода?

1 Ответ

0 голосов
/ 07 января 2019

Прежде всего, вам необходимо решить, хотите ли вы версию 22.0 или версию 26.0-android.

Затем вы добавляете запись <dependencyManagment> в poms (или, что еще лучше, в общий родительский pom), которая управляет com.google.guava:guava нужной вам версией.

ЗависимостьManagement (https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management) перезаписывает все транзитивно найденные номера версий этой зависимости. Таким образом, вы получаете только выбранную вами версию.

...