Мы используем Maven BOM для управления зависимостями. из набора библиотек. Раздел DependencyManagement спецификации обычно использует диапазоны версий для указания версий этих библиотек, например, [2.0,2.1)
Child pom.xml, использующие спецификацию, не указывают версии для этих управляемых зависимостей. (Редактировать для уточнения: мы используем определенные версии для сторонних зависимостей, диапазоны используются для внутренних библиотек, которые находятся в стадии разработки, где версии могут быстро меняться. Мы определяем диапазоны версий, чтобы обеспечить широкую совместимость между этими библиотеками, т. е. все в пределах одного и того же основная версия.)
(Обратите внимание, что это не многомодульный проект. Библиотеки и сервисные проекты, использующие механизм BOM, просто объявляют его родительским и извлекают из репозитория Nexus. Они не собираются вместе.)
У нас также есть несколько системных скриптов сборки, которые используют versions:resolve-ranges. для закрепления версий зависимостей, появляющихся в нашей библиотеке и службе pom.xml (не pom.xml спецификации). Эти pom.xml с разрешенными диапазонами регистрируются в системе управления версиями и помечаются тегами, так что, если нам нужно откатить развертывание до более ранней версии, мы можем использовать этот помеченный pom.xml для создания сборки, использующей те же версии зависимостей, что и исходная сборка, даже если теперь доступна более новая версия зависимости (и, таким образом, resolve-ranges
выдаст более новую версию, если мы перезапустим ее).
Я только что заметил, что эти два механизма плохо работают вместе. Запуск versions:resolve-ranges
в библиотеке или службе pom.xml разрешает только диапазоны в этом pom.xml. Версии, находящиеся под управлением зависимостей, по-прежнему не указаны, поэтому, если мы создадим новую сборку с использованием этого pom.xml, мы получим последнюю версию зависимостей в диапазоне во время сборки. Не то, что мы хотим!
Есть ли способ использовать versions:resolve-ranges
(или любой другой подключаемый модуль или метод) для разрешения управляемых версий и вставки их в дочерний файл 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>com.maventest</groupId>
<artifactId>myproject</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>myproject</name>
<url>http://maven.apache.org</url>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>[2.0, 2.3]</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
Дочерний проект с использованием спецификации (одна управляемая зависимость, одна неуправляемая):
<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">
<parent>
<groupId>com.maventest</groupId>
<artifactId>myproject</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../myproject/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.maventest</groupId>
<artifactId>mytest</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>mytest</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>[3.8, 3.9)</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Фрагмент из mvn dependency:tree
, показывающий эффективные версии зависимостей:
[ИНФОРМАЦИЯ] com.maventest:mytest:jar:1.0-SNAPSHOT
[INFO] +- commons-lang:commons-lang:jar:2.3:compile
[INFO] \- junit:junit:jar:3.8.2-brew:test
Раздел зависимостей из mytest pom.xml после mvn versions:resolve-ranges
:
<dependencies>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.2-brew</version>
<scope>test</scope>
</dependency>
</dependencies>
Таким образом, неуправляемая зависимость разрешается, как и ожидалось. А вот управляемый - нет. Как я могу решить это тоже?