Если 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] ------------------------------------------------------------------------
Другие вопросы по тегам