Исключить зависимость в профиле

У меня есть модуль 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.