#java #maven #dependency-management
#java #maven #управление зависимостями
Вопрос:
У нас есть многомодульный проект, в котором мы определяем несколько зависимостей в родительском pom под dependencyManagement
тегом для управления версией зависимостей.
Он отлично работает для нескольких модулей, кроме одного.
Родительский pom
<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>
<groupId>my.org.product</groupId>
<artifactId>product-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<parade-web.version>2.0.0</parade-web.version>
<!-- other properties -->
</properties>
<modules>
<module>../ProductWeb</module>
<!-- other modules -->
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>my.org.parade</groupId>
<artifactId>ParadeWeb</artifactId>
<version>${parade-web.version}</version>
</dependency>
<!-- other dependencies -->
</dependencies>
</dependencyManagement>
</project>
ProductWeb pom
<?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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>my.org.product</groupId>
<artifactId>product-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../productparent</relativePath>
</parent>
<artifactId>ProductWeb</artifactId>
<packaging>war</packaging>
<version>1.0.0-SNAPSHOT</version>
<dependencies>
<dependency> <!-- 'dependencies.dependency.version' for my.org.parade:ParadeWeb:jar is missing. -->
<groupId>my.org.parade</groupId>
<artifactId>ParadeWeb</artifactId>
<type>war</type>
</dependency>
<!-- other dependencies -->
</dependencies>
</project>
Если я добавлю <version>${parade-web.version}</version>
в свой ProductWeb pom, NetBeans предупредит меня, что
Переопределяет версию, определенную в dependencyManagement . Управляемая версия — 2.12.2-RELEASE.
Единственное различие между этой зависимостью и другой — это тип войны, но я не понимаю, почему управление зависимостями не устанавливает его версию.
Обновить
Мне удалось опустить тег version, но мне нужно было добавить <type>war</type>
как родительский, так и дочерний.
Я не понимаю. Родительский элемент пытается разрешить версию зависимости, ищущую войну, но затем не передает ее через своих дочерних элементов?
Комментарии:
1. Вам нужно добавить тип в обоих местах. Типы не могут быть «управляемыми», но являются частью фундаментальных координат, таких как artifactId и groupId.
2. Файл войны в качестве зависимости обычно неверен, за исключением того, что вы используете опцию skinnyWars в файлах EAR, но используете WAR в качестве запрашивающего… Я полагаю, что есть проблема…
Ответ №1:
Добавьте <type>war</type>
в dependencyManagement. Это должно сработать.
Комментарии:
1. Я пробовал это, но с версией в дочернем pom я получаю ту же ошибку, и если я укажу ее, наш репозиторий артефактов попытается загрузить jar вместо войны
2. Если вы укажете тип war, artifactory загрузит jar? Я не могу вас понять…
3. Вот почему я здесь…
version
иtype
теги не наследуются, но ide жалуется, если я переопределяю версию4. Другой вопрос: странно иметь войну как зависимость в войне. Чего вы пытаетесь достичь с помощью этого?
5. Я согласен с вами. Это странная вещь, которую моя компания делает, чтобы наследовать веб-адаптеры, обработчик, страницы и сервлет, которые уже настроены. Не совсем хорошая архитектура… Кстати, я только что отредактировал свой ответ. Похоже, вы были правы, я переместил тег типа из дочернего элемента в родительский, а не просто добавил его в родительский (сохранив тот, который находится в дочернем pom)