Почему исключение зависимости Maven не приведет к ошибке компиляции?
Недавно подвергшись воздействию Maven, я могу понять пример использования <exclusion>
тег, но не уверен, почему это не приведет к ошибке компиляции:
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-embedder</artifactId>
<version>2.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
</exclusion>
</exclusions>
</dependency>
...
Это возможно только тогда, когда у вас есть другая прямая зависимость от maven-core? в противном случае должна произойти ошибка компиляции. (при условии, maven-core
используется где-то в maven-embedder
)
3 ответа
Есть разные возможности:
- Как сказал Карл: проверь
dependency:tree
если зависимость не вытащена откуда-то еще. - Возможно, что
maven-core
не используется вообще, даже еслиmaven-embedder
действительно использует это: предположим, например, чтоmaven-embedder
имеет два класса A и B. Вы используете только A, ноmaven-core
используется только B. Тогда (если A и B не используют друг друга), ваш проект может быть полностью независим отmaven-core
, (Дополнительное замечание: некоторые банки должны логически быть двумя отдельными банками, но когда они объединены по какой-либо причине - в нашем примере следует подумать о размещении A и B в отдельных артефактах). - Возможно, что переходные зависимости не нужны во время компиляции, но используются во время выполнения.
Вы исключаете этот артефакт из этой конкретной зависимости, но он может быть извлечен из другой зависимости. Используя что-то mvn dependency:tree -Dverbose -Dincludes=maven-core
должен показать вам, что еще вводит зависимость. Плагин Maven Enforcer также может помочь исключить транзитивные зависимости.
Ошибка не будет сгенерирована во время компиляции, она будет сгенерирована во время выполнения, если вы используете какую-либо функцию, зависящую от maven-core