Pull to refresh

Управление версиями зависимостей в Maven проекте

Reading time 4 min
Views 32K
Одним из преимуществ организации Java проекта с помощью Maven является удобное описание всех библиотек и их версий, которые для него требуются. Далее, по мере развития проекта, нам наверняка захочется иметь возможность обновлять версии этих библиотек. Такой функционал предоставляет расширение Versions Maven.

Управление версиями зависимостей можно разделить на три части:
  1. версия родительского проекта (если имеется);
  2. версия зависимостей;
  3. версия используемых расширений Maven.

Самая простая задача — это обновление версии родительского проекта. Достаточно в корне вашего проекта запустить команду:

mvn versions:update-parent

Для того, чтобы иметь возможность обновлять версии остальных зависимостей, их версии необходимо в явном виде описать как переменные в разделе properties проекта Maven. Зависимости, версии которых описаны без ссылки на переменную, обновить таким образом не получится.

Это же относится и к версиям всех используемых вами расширений. Таким образом, нужно явно прописать в проекте все используемые расширения с вынесением их версий в переменные, после чего их версии тоже начнут обновляться.

В результате, все наши зависимости и расширения будут выглядеть таким образом:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <properties>
        <spring.version>4.2.0.RELEASE</spring.version>
        <maven-clean.version>2.6.1</maven-clean.version>
    </properties>

    <dependencies>
        <!-- Spring Framework -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>
    </dependencies>

    <build>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-clean-plugin</artifactId>
                <executions>
                    <execution>
                        <id>auto-clean</id>
                        <phase>initialize</phase>
                        <goals>
                            <goal>clean</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>

        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>${maven-clean.version}</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

Чтобы разобраться с тем, какие ещё расширения мы не указали явным образом, нам нужно воспользоваться командой:

mvn versions:display-plugin-updates

по результатам работы которой можно узнать, какие ещё расширения не прописаны в вашем проекте и версиями которых вы не управляете. Так же будет указано, какую минимальную версию Maven необходимо указать в вашем проекте для корректной работы всех расширений.

Важно отметить, что зависимости, которые включаются в ваш проект через родительский проект, не будут обновлять версии пока вы их явно не включите в список зависимостей своего проекта, перенеся из родительского. Это может быть полезно, если в своём проекте вы хотите иметь отличный набор версий чем предоставляет готовый родительский проект.

После выполнения всех описанных выше операций мы можем непосредственно обновить все версии описанные нами как переменные, запустив команду:

mvn versions:update-properties

Далее вы можете просмотреть список внесённых расширением правок в Maven проект и принять решение об их целесообразности.

Просматривая список предложенных новых версий, вы очень быстро обнаружите, что там начинаются появляться не финальные версии зависимостей, которые скорее всего вам не нужны. Для описания, какие версии при обновлении вы бы хотели пропускать, служит специальный файл, где можно описать исключения в виде конкретных версий или regex выражений для конкретных зависимостей или их групп.

Создадим файл maven-version-rules.xml в корне проекта с таким содержимым:
<?xml version="1.0" encoding="UTF-8"?>
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         comparisonMethod="maven"
         xmlns="http://mojo.codehaus.org/versions-maven-plugin/rule/2.0.0"
         xsi:schemaLocation="http://mojo.codehaus.org/versions-maven-plugin/rule/2.0.0 http://www.mojohaus.org/versions-maven-plugin/xsd/rule-2.0.0.xsd">
    <rules>       
        <rule groupId="org.hibernate">
            <ignoreVersions>
                <ignoreVersion type="regex">.*Alpha.*</ignoreVersion>
                <ignoreVersion type="regex">.*Beta.*</ignoreVersion>
                <ignoreVersion type="regex">.*[.]CR.*</ignoreVersion>
            </ignoreVersions>
        </rule>
    </rules>
</ruleset>

И подключим его:
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>versions-maven-plugin</artifactId>
    <configuration>
        <generateBackupPoms>false</generateBackupPoms>
        <rulesUri>file://${project.basedir}/maven-version-rules.xml</rulesUri>
    </configuration>
</plugin>

В результате, вы можете захотеть создать такой файл update.bat (как вариант, update.sh) для обновления версий в будущем:

call mvn versions:update-parent versions:update-properties

или только:

call mvn versions:update-properties

Нужно отметить, что такие проекты как Spring IO platform и Spring Boot в своих родительских проектах уже предоставляют актуальные и протестированные на совместимость версии очень большого количества библиотек, что позволяет использовать их в своих проектах без указание конкретной версии.

Все исходники доступны на GitHub.
Tags:
Hubs:
+15
Comments 137
Comments Comments 137

Articles