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