Необязательные зависимости и исключения зависимостей

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

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

 Stephan11 окт. 2016 г., 16:36
Альтернативный ответ доступен здесь:stackoverflow.com/a/39979760/363573
 dnault03 мая 2016 г., 21:51
Не решает проблему, но плагинфункция запрещенных зависимостей это приведет к сбою сборки, если проникнут нежелательные зависимости. Однако вам все равно придется вручную исключить их: - /

Ответы на вопрос(4)

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

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

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

комментарий Дно:

Можно использоватьПравило запрещенных зависимостей плагина 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 Глобальные исключения зависимости

 aprodan22 дек. 2018 г., 04:00
Следуя вашему ответу и прочитав обсуждение по предоставленной вами ссылке, я понял, что нежелательные файлы jar иногда попадают в жирный файл jar только потому, что версии maven, используемые на локальном и на сервере, различаются, поэтому логика упаковки может добавлять совершенно разные версии зависимостей, если они строго не соблюдаются. Для решения моей аналогичной проблемы я использовал конфигурацию spring-boot-maven-plugin / exclude / exclude для <goal> repackage </ goal>.

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

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

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

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

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

Рекомендации

Диапазон версий MavenНеобязательные зависимости и исключения зависимостей
Решение Вопроса

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 ».

 Joffer30 июн. 2017 г., 16:20
Я больше не использую Maven, поэтому я не в состоянии проверить другие ответы, но я бы посоветовал людям рассмотреть их в случае, если есть тот, который не является частичным взломом, согласно @TuukkaMustonen
 Stephan11 окт. 2016 г., 16:20
@TuukkaMustonen А как насчетruntime сфера вместоprovided объем?
 Tuukka Mustonen03 янв. 2012 г., 18:18
Это все еще только частичный взлом - зависимость не окажется внутри артефакта сборки, но она все еще доступна во время тестов.
 Sébastien Le Callonnec18 янв. 2011 г., 12:21
Он сделал свое дело, идеально!
 Stephan11 окт. 2016 г., 16:35
Что произойдет, если avalon-framework 4.1.3+ включен в другое место проекта? Смотрите ответ здесь:stackoverflow.com/a/39979760/363573

Ваш ответ на вопрос