Если EAR pom наследует родителя
Это такой же вопрос об использовании мавена <dependencymanagement>
раздел так же, как и о том, как и EAR модуль должен разыграться.
У меня типичный вариант использования. Ниже приведены maven модули
- родитель
- апи
- EJB
- Web
- ухо
ухо имеет api
, ejb
а также web
указаны как его зависимости и наследуются от parent
как и другие модули.
Вот раздел управления зависимостями для parent
,
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.4</version>
</dependency>
</dependencyManagement>
и для ejb
У меня есть зависимость (не в разделе управления зависимостями, а зависимость) с явным переопределением версии.
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>2.5</version>
</dependency>
Когда я строю весь проект из родительского (так как они объединены в родительском pom), проект EAR создает конечный артикул EAR.
Пока все хорошо, но проблема возникает в способе разрешения зависимостей. Мой инстинкт состоит в том, что, поскольку модуль ejb явно перечисляет версию 2.5 ядра Spring, он будет упакован как зависимость. Но на самом деле происходит то, что модуль EAR, являющийся дочерним по отношению к родительскому pom, использует версию, упомянутую в разделе управления зависимостями родительского pom, и в итоге принимает версию 3.4 в качестве основной базовой версии.
После долгих исследований я убедился, что это согласно документации Maven. Но сейчас я думаю о том, что если я объединю стратегию родительского pom, управляющего всеми версиями зависимостей, со стратегией модуля EAR, наследующего родителя, я, по сути, "застрял" (в некоторых случаях) с тем, что родитель определяет без шанс переопределить это.
Хотя можно утверждать, что в идеале должна быть одна и та же версия jar, в некоторых ситуациях вы сталкиваетесь с необходимостью переопределить некоторые версии зависимостей.
Какой правильный подход позволяет мне переопределить версию? Использование пружины в этом примере только для примера. Это может быть любая другая банка.
1 ответ
Управление зависимостями фактически позволяет вам централизовать управление версиями зависимостей, не добавляя зависимости внутри всех дочерних элементов (говоря об общих зависимостях). Это очень помогает, когда проект с несколькими уровнями наследования, где дети могут получить переходные зависимости от родительского pom, как и ваш проект.
Относительно переопределения версии, не заблуждайтесь, потому что вы можете переопределить унаследованную версию зависимости, просто объявив ее в подмодуле, который должен иметь свою собственную версию какого-либо артефакта.
Вот пример демонстрации того, что простой проект с именем root
и имеющий два подмодуля; blessed-module
тот, который наследует его родительскую версию артефакта и odd-module
который выбрал свой собственный путь и свою собственную версию артефакта:
root
\+ blessed-module
+ odd-module
Родительский pom установит централизованные зависимости, имеющие дескриптор ниже (pom.xml):
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>dependency.management.showcase</groupId>
<artifactId>root</artifactId>
<packaging>pom</packaging>
<version>1.0</version>
<modules>
<module>blessed-module</module>
<module>odd-module</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
Дочерние модули будут выглядеть следующим образом, начиная с хорошего blessed-module
:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>dependency.management.showcase</groupId>
<artifactId>root</artifactId>
<version>1.0</version>
</parent>
<artifactId>child-module</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
</dependencies>
</project>
и файл pom.xml odd-module
:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>root</artifactId>
<groupId>dependency.management.showcase</groupId>
<version>1.0</version>
</parent>
<artifactId>odd-module</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>2.5</version>
</dependency>
</dependencies>
</project>
Теперь никаких дальнейших действий не требуется, просто перейдите к root
home path и выполните нижеприведенную команду maven из терминала, чтобы перед вами отображалось все дерево зависимостей
mvn dependency:tree
Вы увидите субмодули с немного разными версиями spring-core
артефакт:
[INFO] ------------------------------------------------------------------------
[INFO] Building root 1.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ root ---
[INFO] dependency.management.showcase:root:pom:1.0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building child-module 1.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ child-module ---
[INFO] dependency.management.showcase:blessed-module:jar:1.0
[INFO] \- org.springframework:spring-core:jar:3.2.8.RELEASE:compile
[INFO] \- commons-logging:commons-logging:jar:1.1.3:compile
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building odd-module 1.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ odd-module ---
[INFO] dependency.management.showcase:odd-module:jar:1.0
[INFO] \- org.springframework:spring-core:jar:2.5:compile
[INFO] \- commons-logging:commons-logging:jar:1.1:compile
[INFO] ------------------------------------------------------------------------