Я смотрю на реструктуризацию большого проекта Maven ...
Базовый обзор нашей текущей структуры:
build [MVN plugins, third party dependency management]:5.1
NRW Utils:6.0.0.0-beta12-SNAPSHOT
server-utils:6.0.0.0-beta12-SNAPSHOT
...
CMW Root:6.0.0.0-beta12-SNAPSHOT
cmw-webapp:6.0.0.0-beta12-SNAPSHOT
cmw-core [dependencies on NRW Utils]:6.0.0.0-beta12-SNAPSHOT
...
NRW Root :6.0.0.0-beta12-SNAPSHOT
nrw-webapp [depends on NRW Utils & CMW Root modules]:6.0.0.0-beta12-SNAPSHOT
...
Причина изменения:
Размер каждого коллективного модуля (то есть NRW Utils, CMW Root и NRW Root) увеличивается, и процесс сборки начинает занимать невыносимое время (иногда ~ 4 часа).
Новый план:
build [MVN plugins, third party dependency management]:5.1
NRW Utils:6.0.0.0-NU-beta4-SNAPSHOT
server-utils:6.0.0.0-NU-beta4-SNAPSHOT
...
CMW Root:6.0.0.0-CMW-beta12-SNAPSHOT
cmw-webapp:6.0.0.0-CMW-beta12-SNAPSHOT
cmw-core [dependencies on NRW Utils]:6.0.0.0-CMW-beta12-SNAPSHOT
...
NRW Root :6.0.0.0-NRW-beta9-SNAPSHOT
nrw-webapp [depends on NRW Utils & CMW Root modules]:6.0.0.0-NRW-beta9-SNAPSHOT
...
Мы начали вводить «ключи» в версии, чтобы различать разные «коллективные модули» и, следовательно, легко выполнять пошаговые выпуски. Кроме того, наши служебные модули гораздо более стабильны, поэтому нам может потребоваться не так много бета-версий - теперь нет ограничений на синхронизацию бета-чисел.
Стоит также отметить, что на самом деле существует 5 разных «коллективных модулей» (а не только 3), которые должны быть собраны с разными версиями (отличающимися уникальными ключами), поэтому я подумал, что было бы неплохо иметь централизованное место для версий, в отличие от дублирующих свойств в 5 разных POM.
Проблема теперь заключается в содержимом файлов POM при определении зависимостей от модулей в другом «коллективном модуле» другой версии.
Предлагаемое решение для управления версиями зависимостей:
build [MVN plugins, third party dependency management]:5.1
nrw-version-management:6.0.0.0-beta-SNAPSHOT
[contains properties defining latest versions of each collective module]
NRW Utils:6.0.0.0-NU-beta4-SNAPSHOT
server-utils:6.0.0.0-NU-beta4-SNAPSHOT
...
CMW Root:6.0.0.0-CMW-beta12-SNAPSHOT
cmw-webapp:6.0.0.0-CMW-beta12-SNAPSHOT
cmw-core [dependencies on NRW Utils]:6.0.0.0-CMW-beta12-SNAPSHOT
...
NRW Root :6.0.0.0-NRW-beta9-SNAPSHOT
nrw-webapp [depends on NRW Utils & CMW Root modules]:6.0.0.0-NRW-beta9-SNAPSHOT
...
nrw-version-management (pom.xml):
...
<parent>
<groupId>com.project</groupId>
<artifactId>build</artifactId>
<version>5.1</version>
</parent>
<groupId>com.project</groupId>
<artifactId>nrw-versions-manager</artifactId>
<version>6.0.0.0-beta-SNAPSHOT</version>
<name>Version Maven Properties</name>
<description>A centralised place for all module property versions</description>
<packaging>pom</packaging>
<properties>
<nrw.utilities.version>6.0.0.0-NU-beta4-SNAPSHOT</nrw.utilities.version>
<nrw.cmw.version>6.0.0.0-CMW-beta12-SNAPSHOT</nrw.cmw.version>
<nrw.version>6.0.0.0-NRW-beta9-SNAPSHOT</nrw.version>
</properties>
...
CMW Root (pom.xml):
...
<parent>
<groupId>com.project</groupId>
<artifactId>nrw-versions-manager</artifactId>
<version>${nrw.core.version}</version>
...
</parent>
<groupId>com.project</groupId>
<artifactId>CMW-root</artifactId>
<version>6.0.0.0-CMW-beta12-SNAPSHOT</version>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
...
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>server-utils</artifactId>
<version>${nrw.utilities.version}</version>
</dependency>
...
</dependencyManagement>
<profiles>
<profile>
<id>all</id>
<modules>
<module>cmw-webapp</module>
<module>cmw-core</module>
...
</modules>
</profile>
...
</profiles>
...
N.B. тогда для свойства $ {nrw.core.version} будет установлено значение 6.3.0.0-beta-SNAPSHOT для создания снимка с помощью аргументов командной строки (или значения свойства по умолчанию).
Возможный процесс выпуска (для 6.0.0.0):
- Сборка модуля сборки 5.1, если он еще не собран
- Сборка nrw-version-management 6.0.0.0 (чтобы избежать зависимостей моментальных снимков - однако свойства пока не изменены)
- Сборка NRW Utils 6.0.0.0-NU
cmd args: -Dnrw.core.version = 6.0.0.0
- Сборка CMW Root 6.0.0.0-CMW
cmd args: -Dnrw.core.version = 6.0.0.0 -Dnrw.utilities.version = 6.0.0.0-NU
- Сборка NRW Root 6.0.0.0-NRW
cmd args: -Dnrw.core.version = 6.0.0.0 -Dnrw.utilities.version = 6.0.0.0-NU -Dnrw.cmw.version = 6.0.0.0-CMW
- Перестройте nrw-version-management 6.0.0.0 для хранилища.
cmd args: -Dnrw.core.version = 6.0.0.0 -Dnrw.utilities.version = 6.0.0.0-NU -Dnrw.cmw.version = 6.0.0.0-CMW
- Сборка nrw-version-management 6.1.0.0-beta-SNAPSHOT с новыми версиями для разработчиков и обновлением POM-файла
Проблема:
Процесс сборки выглядит запутанным, особенно в связи с модулем управления версиями nrw.
Также я начал видеть это предупреждение:
'version' содержит выражение, но должно быть константой
И, проведя некоторое исследование, я теперь понимаю, что выражения не рекомендуется при установке версий (при указании родительского POM):
Вопросы:
- Могу я просто проигнорировать это предупреждение? Некоторые публикации начинают предполагать, что может быть просто допустимо указывать родительские версии POM, используя свойства.
- Является ли этот общий подход общепринятым? Или ущербный?
- Существуют ли лучшие решения для реструктуризации этого растущего проекта?
Заранее спасибо.