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