Я приговариваю к длине этого сообщения, но мне было трудно сделать его более кратким, не представляя картинку. Недавно я унаследовал работу мастера сборки для мультимодульного проекта maven 3.0. Проблема в том, что структура проекта/модулей является катастрофой. Из того, как вещи хранятся в Source Control (мы используем RTC) для структуры pom модулей, я разрываю волосы, пытаясь получить полный цикл сборки, завершенный каждый раз.
В качестве иерархии проекта все модули сохраняются "плоскими"; т.е.: все находится на одном уровне. У меня родительский pom, и все модули зависят от родителя. Однако родительский элемент находится на том же уровне, что и все мои другие модули.
Пример:
c:\dev\MyEarProject
+ parent-pom
- pom.xml
+ module1
- pom.xml (depends on parent-pom)
- src
- main
- ...
+ module2
- pom.xml (depends on parent-pom)
- src
- main
- ...
+ module3
- pom.xml (depends on parent-pom)
- src
- main
- ...
Родительский pom определяет все модули, необходимые для создания проекта, а также набор свойств для номеров версий артефакта, используемых во всех подмодулях:
<modules>
<module>../module1</module>
<module>../module2</module>
<module>../module3</module>
</modules>
<properties>
<org.springframework.version>3.0.5.RELEASE</org.springframework.version>
<slf4j.version>1.6.4</slf4j.version>
<repositoryAddress>${snapshots.repo.url}</repositoryAddress>
<my.hibernate-module.dao.impl>1.2.3</my.hibernate-module.dao.impl>
<my.hibernate-module.dao.api>1.2.3</my.hibernate-module.dao.api>
</properties>
Каждый модуль pom, в свою очередь, зависит от родительского pom через номер артефакта pom:
<parent>
<groupId>com.cws.cs.lendingsimulationservice</groupId>
<artifactId>parent-pom</artifactId>
<version>1.0.6</version>
</parent>
Чтобы сделать вещи еще более запутанными, фактическое имя артефакта может или не может (в зависимости от модуля) соответствовать пути к модулю. Например, модуль 1 может быть расположен в пути c:\dev\MyEarProject\module1
, но имеет имя артефакта hibernate-module
. Однако из-за того, что он хранится в RTC, каталог вызывается module1
, когда он выгружен.
Самый простой способ построить все, конечно, - это войти в c:\dev\MyEarProject\parent-pom\
и запустить mvn clean deploy
. Это отлично работает в режиме SNAPSHOT, так как репозиторий SNAPSHOT допускает множественное развертывание одной и той же версии артефакта. Но в режиме выпуска это не удается.
Эта структура вызывает для меня 2 проблемы.
- Каждый раз, когда мне нужно изменить версию свойства в родительском, мне нужно обновить номер версии родительского помпе и все родительские версии pom child modules и всю версию дочерних модулей (так как родитель изменил).
- Всякий раз, когда мне нужно развернуть цикл выпуска, mvn выдает ошибку, если один из модулей не изменился со времени последнего цикла и, следовательно, не может быть перераспределен на один и тот же репо (репо не позволяет перезаписывать существующие артефакты)
Итак, я ищу лучший способ реструктурировать этот проект, чтобы избежать этих проблем. Для родительского pom я знаю, что я могу использовать относительный путь, чтобы вместо этого указывать на родителя. Однако, учитывая "плоскую" структуру модулей, это рекомендуемый подход (то есть: относительный путь родительского пома был бы.. /parent -pom/pom.xml - кажется немного странным для меня)? Кроме того, учитывая, что управление версиями родителя не зависит от модулей, использование относительного пути не только откроет дверь для дополнительной путаницы (т.е. Не будет никакого способа узнать, какая версия родительского помпа связана с какой версией подмодуля).
Во-вторых, как я могу построить все ухо, не сталкиваясь с ошибками развертывания, которые у меня есть? Поскольку артефакт уже существует в репо, мне не нужно его перестраивать и переустанавливать. Я попытался использовать --projects, но с количеством задействованных модулей, с ним очень сложно справиться.