Почему исключение зависимости 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 ответа

Решение

Есть разные возможности:

  1. Как сказал Карл: проверь dependency:tree если зависимость не вытащена откуда-то еще.
  2. Возможно, что maven-core не используется вообще, даже если maven-embedder действительно использует это: предположим, например, что maven-embedder имеет два класса A и B. Вы используете только A, но maven-core используется только B. Тогда (если A и B не используют друг друга), ваш проект может быть полностью независим от maven-core, (Дополнительное замечание: некоторые банки должны логически быть двумя отдельными банками, но когда они объединены по какой-либо причине - в нашем примере следует подумать о размещении A и B в отдельных артефактах).
  3. Возможно, что переходные зависимости не нужны во время компиляции, но используются во время выполнения.

Вы исключаете этот артефакт из этой конкретной зависимости, но он может быть извлечен из другой зависимости. Используя что-то mvn dependency:tree -Dverbose -Dincludes=maven-core должен показать вам, что еще вводит зависимость. Плагин Maven Enforcer также может помочь исключить транзитивные зависимости.

Ошибка не будет сгенерирована во время компиляции, она будет сгенерирована во время выполнения, если вы используете какую-либо функцию, зависящую от maven-core

Другие вопросы по тегам