Есть ли способ исключить зависимость 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, частично для того, чтобы избежать проблем в будущем, когда люди добавляют зависимости, которые зависят от этой исключенной зависимости, и забывают ее исключить.

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

339   4  

4 ответов:

это поможет? http://jlorenzen.blogspot.com/2009/06/maven-global-excludes.html

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

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

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

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

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

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

расширить на комментарий dnault:

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

<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 глобальные исключения зависимостей

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

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

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

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

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

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

ссылки

    Ничего не найдено.

Добавить ответ:
Отменить.