Керування версіями залежностей в Maven проекті

Одним з переваг організації 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.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.