Исключить зависимость в профиле
У меня есть модуль maven, который имеет некоторые зависимости. В определенном профиле я хочу исключить некоторые из этих зависимостей (точнее, всех зависимостей с определенным идентификатором группы). Однако они должны присутствовать во всех других профилях. Есть ли способ указать исключения из зависимостей для профиля?
Ответы
Ответ 1
Насколько мне известно, нет, вы не можете дезактивировать зависимости (вы можете исключить транзитивные зависимости, но это не то, о чем вы просите), и да, то, что вы сейчас делаете с POM (вручную редактируете), неверно.
Итак, вместо удаления зависимостей вы должны поместить их в профиль и либо:
- Вариант №1: используйте профиль, если требуется, или
- Вариант № 2: пометить профиль как активированный по умолчанию или поместить его в список активных профилей и отключить его, когда это необходимо.
Третий вариант будет (не основан на профиле):
- Вариант № 3: отдельные вещи в двух разделенных модулях (как вы разделяли проблемы) и используете наследование.
Ответ 2
Один из способов, который возникает для меня, - иметь зависимости в отдельном помпе. Затем вы можете добавить раздел <exclusions>
через профиль.
<dependencies>
<dependency>
<groupId>my.company.dependencies</groupId>
<artifactId>my-dependencies</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>pom</type>
</dependency>
</dependencies>
<profile>
<activation>
<activeByDefault>false</activeByDefault>
<property>
<name>exclude-deps</name>
</property>
</activation>
<dependencies>
<dependency>
<groupId>my.company.dependencies</groupId>
<artifactId>my-dependencies</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>my.company</groupId>
<artifactId>bad-dep-1</artifactId>
</exclusion>
<exclusion>
<groupId>my.company</groupId>
<artifactId>bad-dep-2</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</profile>
Ответ 3
Вместо исключения зависимостей в профиле вы можете установить их как provided
. Это не требует чрезмерно сложной конфигурации и исключает зависимости, которые вы не хотите от окончательной сборки.
В желаемом профиле добавьте раздел dependencies
, скопируйте объявление тех, которые хотите исключить, и укажите их как provided
.
Например, скажем, вы хотите исключить slf4j-log4j12
:
<profiles>
<!-- Other profiles -->
<profile>
<id>no-slf4j-log4j12</id>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.2</version>
<scope>provided</scope>
</dependency>
</dependencies>
</profile>
<!-- Other profiles -->
</profiles>
Ответ 4
Я не думаю, что можно исключить и прямые зависимости (по крайней мере, ничего не упоминается здесь).
Лучшее, что вы можете сделать, - заключить нужные зависимости для каждого случая в разные профили (как уже было предложено), но вам нужно создать два "взаимоисключающих" профиля, один из которых "активен по умолчанию" ". Самый надежный способ добиться этого - использовать параметр для активации вашего профиля, например.
<profiles>
<profile>
<id>default-profile</id>
<activation>
<property><name>!exclude</name></property>
</activation>
<dependencies>
dependency-A
dependency-B
...
</dependencies>
</profile>
<profile>
<id>exclude-profile</id>
<activation>
<property><name>exclude</name></property>
</activation>
<!-- exclude/replace dependencies here -->
</profile>
</profiles>
Затем использование "mvn [goal]" будет использовать профиль "default-profile" профиля, но "mvn [goal] -Dexclude" будет использовать профили исключений профиля.
Обратите внимание, что использование "activeByDefault" вместо параметра для вашего профиля "по умолчанию" может работать в некоторых случаях, но это также может привести к неожиданному поведению. Проблема в том, что "activeByDefault" делает профиль активным, пока в другом модуле многомодульной сборки нет другого активного профиля.
Ответ 5
Бит-грязное, но легкое решение - использовать <scope>import</scope>
.
В отличие от других областей, вы можете использовать это:
- отключит время компиляции и время выполнения; в отличие от
provided
или runtime
, который отключает только один за раз
- не испортит вашу область
test
- вам не нужно указывать путь к некоторому фиктивному банку, как
system
требуется область
Ничего не импортируется, пока вы используете этот хак вне dependencyManagement
.