Есть ли способ исключить зависимость Maven во всем мире?

Я пытаюсь найти "общий" способ исключения транзитивной зависимости из включенного без необходимости исключать его из всех зависимых от него зависимостей. Например, если я хочу исключить slf4j, я делаю следующее:

  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jmx</artifactId>
    <version>3.3.2.GA</version>
    <exclusions>
      <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>3.4.0.GA</version>
    <type>jar</type>
    <exclusions>
      <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
      </exclusion>
    </exclusions>
  </dependency>

Это частично для очистки файла pom, частично, чтобы избежать проблем в будущем, когда люди добавляют зависимости, зависящие от этой исключенной зависимости, и забывают исключить ее.

Есть ли способ?

Ответ 1

Помогает ли это? http://jlorenzen.blogspot.com/2009/06/maven-global-excludes.html

"Предполагая, что я хочу исключить avalon-framework из своей WAR, я бы добавил следующее к моим проектам POM с областью предоставления. Это работает во всех транзитивных зависимостях и позволяет вам указать его один раз.

<dependencies>
  <dependency>
      <artifactId>avalon-framework</artifactId>
      <groupId>avalon-framework</groupId>
      <version>4.1.3</version>
      <scope>provided</scope>
  </dependency>
</dependencies>

Это даже работает при указании его в родительском POM, что помешает проектам объявить это во всех дочерних POM.

Ответ 2

Я создал пустую банку и создал эту зависимость:

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <scope>system</scope>
    <systemPath>${basedir}/src/lib/empty.jar</systemPath>
    <version>0</version>
</dependency>

Это не идеально, потому что с этого момента у вас есть пустая банка на вашем пути компиляции/теста. Но это просто косметика.

Ответ 3

В качестве напоминания, вот ответ из официальной документации Maven:

Почему исключения выполняются на основе зависимости, а не на уровне POM

В основном это делается для того, чтобы убедиться, что график зависимостей предсказуем и сохранить эффекты наследования от исключения зависимости, которая не должна быть исключена. Если вы переходите к методу последней инстанции и должны быть исключены, вы должны быть абсолютно уверены, какая из ваших зависимостей вносит эту нежелательную транзитивную зависимость.

Если вы хотите сделать сборку более надежной, можно использовать диапазон версий. Это гарантирует, что никакая более новая версия зависимости не может помешать проекту.

<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>[1.4.2,)</version>
   <scope>provided</scope>
</dependency>

Любая версия slf4j-api >= 1.4.2 будет считаться предложенной (предоставленной) во время выполнения либо самим JDK, либо контейнером.

Ссылки

Ответ 4

Развернуть комментарий dnault:

Можно использовать Maven Enforcer плагин Banned Dependencies rule, чтобы гарантировать, что зависимости исключены. Все еще нужно исключить их вручную, но сборка не удастся, если кто-либо добавит зависимость в другом месте по ошибке.

<dependencies>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jmx</artifactId>
    <version>3.3.2.GA</version>
    <exclusions>
      <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
</dependencies>

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>1.4.1</version>
    <executions>
      <execution>
        <goals>
          <goal>enforce</goal>
        </goals>
        <configuration>
          <rules>
            <bannedDependencies>
              <excludes>
                <exclude>org.slf4j:slf4j-api</exclude>
              </excludes>
            </bannedDependencies>
          </rules>
        </configuration>
      </execution>
    </executions>
  </plugin>
</plugins>

Также есть открытый запрос функции: Исключения глобальной зависимости MNG-1977