Ответ 1
Мы все согласны с тем, что JUnit никогда не должен устанавливаться в другой области, кроме test
. Вообще говоря, я не думаю, что есть другое решение, кроме исключения нежелательной зависимости, поэтому мы все согласны с тем, что вы правы в этом.
ПРОСТОЙ СЛУЧАЙ:
Как говорит Андреас Крюгер, может возникнуть риск с версиями (я действительно столкнулся с этим). Скажем, что зависимостями проекта являются следующие:
+-foo:bar:1.0-SNAPSHOT
+-group1:projectA:2.0
+-group2:projectB:3.8.1
+-group2:projectB:4.11
Обратите внимание, что это всего лишь упрощение вашего дела. Если вы видите это дерево зависимостей, вы должны исключить проект зависимости b, заданный projectA:
<dependency>
<groupId>group1</groupId>
<artifactId>projectA</artifactId>
<version>2.0</version>
<exclusions>
<exclusion>
<groupId>group2</groupId>
<artifactId>projectB</artifactId>
</exclusion>
</exclusions>
</dependency>
После упаковки проекта с maven оставшаяся зависимость будет group2-someProjectB-4.11.jar, версия 4.11, а не 3.8.1. Все будет хорошо, и проект будет работать без каких-либо проблем.
Затем, спустя некоторое время, скажем, что вы решили перейти на следующую версию проекта A, версия 3.0, которая добавляет новые замечательные функции:
<dependency>
<groupId>group1</groupId>
<artifactId>projectA</artifactId>
<version>3.0</version>
<exclusions>
<exclusion>
<groupId>group2</groupId>
<artifactId>projectB</artifactId>
</exclusion>
</exclusions>
</dependency>
Проблема в том, что вы еще не знаете, что версия ProjectA 3.0 также обновила проект зависимости b до версии 5.0:
+-foo:bar:1.0-SNAPSHOT
+-group1:projectA:3.0
+-group2:projectB:5.0
+-group2:projectB:4.11
В этом случае исключение, которое вы бы сделали за последнее время, исключает версию projectB версии 5.0.
Однако projectA версии 3.0 нуждаются в улучшениях от версии B версии 5.0. Из-за исключения, после упаковки проекта с maven, оставшаяся зависимость будет group2-someProjectB-4.11.jar, версия 4.11, а не 5.0. На данный момент вы используете какие-либо новые функции projectA, программа будет работать неправильно.
ЧТО БЫЛО РЕШЕНИЕ?
Я столкнулся с этой проблемой в проекте Java-EE.
Команда разработала службы баз данных. Они упаковали его как projectA. Каждый раз, когда они обновляли службы, они также обновляли файл, в котором перечислены все их текущие зависимости и текущие версии.
ProjectA был зависимым от проекта Java-EE, над которым я работал. Каждый раз, когда сервис-команда обновляла ProjectA, я также проверял обновления версий.
На самом деле, нет никакого вреда для исключения зависимости. Но каждый раз, когда вы обновляете зависимость, в которой установлено исключение, вы должны проверить:
- если это исключение все еще имеет смысл.
- если вам нужно обновить версию исключенной зависимости в своем собственном проекте.
Я думаю, что исключения maven похожи на кухонные ножи. Он острый, безрезультатно режет овощи, но требует осторожного обращения...