Maven: версия зависимости Pin, где зависимость управляется спецификацией
Мы используем спецификацию Maven для управления зависимостями набора библиотек. В разделе dependencyManagement спецификации обычно используются диапазоны версий для указания версий этих библиотек, например: [2.0,2.1)
Дочерние файлы pom.xml, использующие спецификацию, не указывают версии для этих управляемых зависимостей. (Изменить для пояснения: мы используем конкретные версии для зависимостей третьих сторон, диапазоны используются для внутренних библиотек, находящихся в процессе разработки, где версии могут быстро меняться. Мы определяем диапазоны версий, чтобы обеспечить широкую совместимость между этими библиотеками, т.е. все в одной и той же основная версия.)
(Обратите внимание, что это не многомодульный проект. Библиотеки и сервисные проекты, использующие механизм спецификации, просто объявляют его как родительский и извлекают его из репозитория Nexus. Они не собраны вместе.)
У нас также есть несколько системных сценариев сборки, которые используют версии: resol-range для закрепления версий зависимостей, появляющихся в нашей библиотеке и сервисе 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
показ эффективных версий зависимостей:
[INFO] 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>
Таким образом, неуправляемая зависимость разрешается, как и ожидалось. Но управляемый нет. Как я могу получить это решение тоже?
0 ответов
Забыл об этом вопросе! В конце концов, я так и не смог найти способ закрепить управляемые версии, основанные на диапазонах. Поэтому я перестал определять версии в спецификации и просто указал их диапазонами в каждом дочернем pom. Больше шаблонов в детских игрушках, но не так уж и плохо.
Мы по-прежнему могли определять свойства, которые указывали диапазоны в спецификации, которые могли использовать дочерние элементы, что немного упрощало добавление всех диапазонов при необходимости.