Почему плагин Maven Versions (версии: use-latest-versions) не обновляет / не меняет версию -SNAPSHOT для выпуска (нет версии -SNAPSHOT)?

Я использую плагин Version Maven Plugin use-latest-versions функциональность для обновления groupID = com.example * версий внутренней зависимости до Последняя версия. Это выполняется как часть нашей системы CI с использованием Jenkins.

Когда разработчики начинают работать над новой функцией, они разветвляют код, работают над ветвью, и когда новая функция реализуется (или частично), код объединяется обратно в основную часть (обычно несколько раз в неделю).

Обновление версии филиалов:

  • Используя "снимок" профиля. См. Ниже конфигурацию профиля моментального снимка pom.xml и конфигурацию репозитория Artifactory.
  • Команда, используемая для обновления версии: mvn -P snapshot -B versions:use-latest-versions versions:update-properties -Dincludes=com.example* -DexcludeReactor=false -DallowSnapshots=true ...

Обновление версии внешней линии:

  • Использование «производственного» профиля. См. Ниже конфигурацию производственного профиля pom.xml и конфигурацию Artifactory.
  • Команда, используемая для обновления версии: mvn -P production -B versions:use-latest-versions versions:update-properties -Dincludes=com.example* -DexcludeReactor=false ...

Иногда сборки веток обновляют версии зависимостей com.example * до версии "...- SNAPSHOT" (это нормально, потому что репозиторий libs-snapshot Artifactory используется в качестве репозитория зависимостей, который может иметь версии зависимостей -SNAPSHOT). Эти обновления версий возвращаются в систему управления версиями (svn).

Когда код (включая изменения обновления версии pom.xml) объединяется обратно из ветвей в магистраль и выполняется сборка магистрали, все версии внутренних зависимостей com.example * должны быть изменены / обновлены до последних версий выпуска. Но по какой-то причине, когда в версиях зависимостей есть "-SNAPSHOT", версии: use-latest-versions не изменяют / не обновляют версию до последней версии (без -SNAPSHOT).


Пример:

Артифакторные репозитории имеют текущие версии:

  • libs-snapshot имеет "com.example: myLib: 1.1.10-SNAPSHOT", "com.example: myLib: 1.1.11-SNAPSHOT"
  • libs-release содержит com.example: myLib: 1.1.9, com.example: myLib: 1.1.12.

Создание веток myApp получит версии зависимостей из libs-snapshot и обновит версию com.example: myLib до 1.1.11-SNAPSHOT и вернет это обновление обратно в SVN.

...    
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>myLib</artifactId>
        <version>1.1.11-SNAPSHOT</version>
    </dependency>
...

Слияние кода обратно в магистраль, включая указанные выше изменения версии зависимостей, и запуск сборки магистрали (включая обновление версии) mvn -P production -B versions:use-latest-versions... не изменяет версию com.example: myLib на 1.1.12.


Конфигурация Artifactory:

  • Локальные репозитории: libs-snapshot-local (репозиторий разработки); libs-release-local (репозиторий релизов)
  • Виртуальные репозитории: libs-snapshot (включая libs-snapshot-local, libs-release-local и удаленные репозитории); libs-release (включает libs-release-local и удаленные репозитории)

конфигурация pom.xml:

...
<profiles>
    <profile>
        <id>snapshot</id>
        <distributionManagement>
            <repository>
                <id>libs-snapshot-local</id>
                <name>Internal Applications Snapshot Repository</name>
                <url>http://example.com/artifactory/libs-snapshot-local</url>
            </repository>
        </distributionManagement>

        <repositories>
            <repository>
                <snapshots>
                    <enabled>true</enabled>
                    <updatePolicy>always</updatePolicy>
                </snapshots>
                <id>libs-snapshot</id>
                <name>libs-snapshot</name>
                <url>http://example.com/artifactory/libs-snapshot</url>
                <releases>
                    <enabled>true</enabled>
                    <updatePolicy>always</updatePolicy>
                </releases>
            </repository>
            <repository>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
                <id>libs-release</id>
                <name>libs-release</name>
                <url>http://example.com/artifactory/libs-release</url>
                <releases>
                    <enabled>true</enabled>
                    <updatePolicy>always</updatePolicy>
                </releases>
            </repository>
        </repositories>

        <build>
            ...
        </build>
    </profile>

    <profile>
        <id>production</id>

        <distributionManagement>
            <repository>
                <id>libs-release-local</id>
                <name>Internal Applications Snapshot Repository</name>
                <!-- Artifacts are promoted to libs-release-local not deployed directly -->
                <url>http://example.com/artifactory/libs-snapshot-local</url>
            </repository>
        </distributionManagement>

        <repositories>
            <repository>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
                <id>libs-release</id>
                <name>libs-release</name>
                <url>http://example.com/artifactory/libs-release</url>
                <releases>
                    <enabled>true</enabled>
                    <updatePolicy>always</updatePolicy>
                </releases>
            </repository>
        </repositories>

        <build>
            ...
        </build>
    </profile>

</profiles>

...


person Norbert Tamas    schedule 04.04.2016    source источник


Ответы (2)


Убедитесь, что вы используете плагин последней версии (2.3). Я считаю, что 2.3 исправил некоторые проблемы (при этом глючный плагин).

Другая проблема, которую я обнаружил с плагином версии, связана с другими целями версии или даже другими целями maven. Не делай этого. Например, в приведенном выше коде вы одновременно используете versions:use-latest-versions versions:update-properties. Вместо этого выполните mvn один раз для каждой из этих целей. Да, это неприятно и замедляет процесс сборки, но я считаю его гораздо более надежным, особенно если вы используете версии: update-parent (хотя в 2.3 эти проблемы могли быть исправлены).

Я также считаю, что excludeReactor обычно не работает. Если вы запускаете обновление версии для совокупного проекта, я не рекомендую это делать. Вместо этого перейдите к каждому подмодулю и выполните команду.

person Adam Gent    schedule 12.09.2016

Вам нужно сделать 2 шага:

  1. mvn versions:use-releases (Это изменит все SNAPSHOT на выпускные версии)
  2. mvn versions:use-latest-release (Это изменит текущую версию выпуска на последнюю доступную версию выпуска)

Думаю, в документации есть ошибка.

http://www.mojohaus.org/versions-maven-plugin/examples/advancing-dependency-versions.html.

Документация:

versions:use-latest-releases ищет в pom все версии, отличные от SNAPSHOT, которые были более новыми, и заменяет их последней версией.

Конфликты с приведенной ниже таблицей целей.

person Robin Schürer    schedule 01.02.2018