Исключение зависимостей Maven

У меня есть запрос об исключении зависимостей maven. Рассмотрим следующее

   <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-taglibs</artifactId>
        <version>${spring-security.version}</version>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-web</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>3.1.0.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>3.1.0.RELEASE</version>
    </dependency>
    <dependency>

Я пытаюсь добиться перехода от Spring 3.0.6 до 3.1.0. Spring Безопасность 3.1.0 зависела от spring -security-web версии 3.0.6, которая, в свою очередь, зависела от spring -web 3.0.6. Мне нужно довести все до 3.1.0. Поэтому я исключаю spring -security-web из Spring безопасности, имеет отдельную зависимость для spring -security-web 3.1.0, которая, в свою очередь, исключает версию spring -web 3.0.6, и я предоставляю отдельную spring -web 3.1.0. Эта работа, но я чувствую, что будет гораздо более простой подход. Я попытался помечать исключение для Spring в Интернете под Spring безопасностью, но это не сработало. Пожалуйста, помогите.

Ответы

Ответ 1

Вы можете использовать механизм управления зависимостями.

Если вы создаете записи в <dependencyManagement> раздел вашего pom для spring -security-web и spring -web с нужной версией версии 3.1.0, управляемая версия артефакта переопределит те, которые указаны в дереве транзитивных зависимостей.

Я не уверен, что это действительно сэкономит вам любой код, но это более чистое решение IMO.

Ответ 2

Глобальные исключения выглядят так, как будто они работают, но до тех пор...

Из ссылка сонатипа maven (внизу страницы):

Управление зависимостями в POM верхнего уровня отличается от просто определяя зависимость от широко распространенного родительского ПОМ. Во-первых, все зависимости наследуются. Если mysql-connector-java были указаны как зависимость исходного проекта верхнего уровня, каждый отдельный проект в иерархия будет ссылаться на эту зависимость. Вместо добавление ненужных зависимостей, использование dependencyManagement позволяет вы должны консолидировать и централизовать управление зависимостью версии без добавления зависимостей, которые наследуются всеми дети. Другими словами, элемент управления dependencyManagement эквивалент переменной среды, которая позволяет вам объявить зависимостей в любом месте ниже проекта без указания версии число.

В качестве примера:

  <dependencies>
    <dependency>
      <groupId>commons-httpclient</groupId>
      <artifactId>commons-httpclient</artifactId>
      <version>3.1</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>3.0.5.RELEASE</version>
    </dependency>
  </dependencies>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <exclusions>
          <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>commons-httpclient</groupId>
        <artifactId>commons-httpclient</artifactId>
        <exclusions>
          <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
    </dependencies>
  </dependencyManagement>

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