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. Больше шаблонов в детских игрушках, но не так уж и плохо.

Мы по-прежнему могли определять свойства, которые указывали диапазоны в спецификации, которые могли использовать дочерние элементы, что немного упрощало добавление всех диапазонов при необходимости.

Другие вопросы по тегам