Я использую maven-enforcer-plugin для проверки проблем конвергенции зависимостей. Типичным результатом будет:
[WARNING] Rule 1: org.apache.maven.plugins.enforcer.DependencyConvergence failed
with message:
Failed while enforcing releasability the error(s) are [
Dependency convergence error for junit:junit:3.8.1 paths to dependency are:
+-foo:bar:1.0-SNAPSHOT
+-ca.juliusdavies:not-yet-commons-ssl:0.3.9
+-commons-httpclient:commons-httpclient:3.0
+-junit:junit:3.8.1
and
+-foo:bar:1.0-SNAPSHOT
+-junit:junit:4.11
]
Увидев это сообщение, я обычно "решал" его, исключая транзитивную зависимость, например
<dependency>
<groupId>ca.juliusdavies</groupId>
<artifactId>not-yet-commons-ssl</artifactId>
<version>0.3.9</version>
<exclusions>
<!-- This artifact links to another artifact which stupidly includes
junit in compile scope -->
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
Я хотел бы понять, действительно ли это исправление и риски, связанные с исключением библиотек таким образом. Как я вижу:
-
"Исправление" обычно безопасно, если я предпочитаю использовать более новую версию. Это зависит от авторов библиотеки, поддерживающих обратную совместимость.
-
Как правило, никакого эффекта на сборку Maven не оказывает (так как выигрывает более быстрое определение), однако, исключая зависимость, которую я рассказываю Maven о том, что я знаю об этой проблеме, и таким образом умиротворяет плагин maven-enforcer.
Правильны ли мои мысли и есть ли альтернативный способ решения этой проблемы? Меня интересуют ответы, которые фокусируются на общем случае - я понимаю, что пример junit
, приведенный выше, немного странный.