Как реструктурировать многомодульный проект Maven?
Я извиняюсь за длину этого поста, но мне было трудно сделать его более кратким, не представляя картину. Недавно я унаследовал работу build-master для многомодульного проекта maven 3.0. Проблема в том, что структура проекта/модулей является катастрофой. От того, как вещи в настоящее время хранятся в системе управления версиями (мы используем RTC) до структуры POM модулей, я разрываю волосы, пытаясь получить полный цикл сборки каждый раз.
как иерархия проекта идет, все модули хранятся "плоскими"; т. е. все находится на одном уровне. У меня есть родительский pom, и все модули зависят от родителя. Однако родитель находится на том же уровне, что и все мои другие модули.
Ex:
c:devMyEarProject
+ 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>
чтобы сделать вещи еще более запутанными, фактическое имя артефакта может или не может (в зависимости от модуля) соответствовать пути модуля. Например, module1 может быть расположен в path c:devMyEarProjectmodule1
но у артефакта имя hibernate-module
. Однако из-за того, как он хранится в RTC, каталог называется module1
, когда он выезжал.
самый простой способ построить все, конечно, это пойти в c:devMyEarProjectparent-pom
и запустить mvn clean deploy
. Это прекрасно работает в режиме моментального снимка, поскольку РЕПО моментального снимка позволяет несколько развертываний одной и той же версии артефакта. Но в режиме release, это не удается.
эта структура вызывает 2 проблемы для меня.
- каждый раз, когда мне нужно изменить версию на свойство в родителе, я должен обновить номер версии parent-pom и все дочерние модули версии parent pom и все дочерние модули версии самих себя (так как родитель измененный.)
- всякий раз, когда мне нужно развернуть цикл выпуска, mvn выдаст ошибку, если один из модулей не изменился с последнего цикла и, следовательно, не может быть перераспределен в то же самое РЕПО (РЕПО не позволяет перезаписывать существующие артефакты)
поэтому я ищу лучший способ реструктуризации этого проекта, чтобы избежать этих проблем. Для родительского pom я знаю, что могу использовать относительный путь, чтобы указать на родителя. Однако, учитывая " квартиру" структура модулей, это рекомендуемый подход (т. е.: Родительский относительный путь pom будет ../ родитель-пом / пом.xml-мне кажется немного странным)? Кроме того, учитывая, что управление версиями родителя не зависит от модулей, использование относительного пути не просто откроет дверь к дополнительной путанице (т. е.: не будет способа узнать, какая версия родительского pom связана с какой версией подмодуля).
во-вторых, как я могу построить весь ухо не встречая развернуть ошибок у меня? Поскольку артефакт уже существует в репо, мне не нужно его перестраивать и повторно развертывать. Я пробовал использовать --projects, но с количеством задействованных модулей становится чрезвычайно сложно управлять.
3 ответов
первое, что я действительно рекомендую, это реструктурировать папки проектов ...это означает, что папка проектов представляет структуру, которая означает не выровнять структуру.
+-- parent-pom (pom.xml)
+--- module1 (pom.xml)
+--- module2 (pom.xml)
+--- module3 (pom.xml)
в результате этого раздел модулей вашего родителя будет упрощен следующим образом:
<modules>
<module>module1</module>
<module>module2</module>
<module>module3</module>
</modules>
кроме того, родительские записи в ваших модулях могут быть упрощены следующим образом:
<parent>
<groupId>com.cws.cs.lendingsimulationservice</groupId>
<artifactId>parent-pom</artifactId>
<version>1.0.6</version>
</parent>
...что приводит меня к следующему точка:
если весь ваш текущий проект определяет своего родителя, как указано выше, это просто неправильно, причина попытается найти родителя в репозитории, а не в папке верхнего уровня. Другими словами это вызывает немало проблем с выпуском и т. д.
если мы исправим эту проблему, она должна выглядеть так, что я не могу рекомендовать:
<parent>
<groupId>com.cws.cs.lendingsimulationservice</groupId>
<artifactId>parent-pom</artifactId>
<version>1.0.6</version>
<relativePath>../parent-pom/pom.xml</relativePath>
</parent>
еще одна вещь, которую я замечаю, что вы не используете SNAPTSHOT
' s, который будет заменен выпуском плагин на этапе выпуска. И в связи с этим он автоматически изменит все версии в соответствующих родителях и т. д.
в идеальном случае модули должны выглядеть так:
<parent>
<groupId>com.cws.cs.lendingsimulationservice</groupId>
<artifactId>parent-pom</artifactId>
<version>1.0.6</version>
</parent>
<artifactId>module-1</artifactId>
<!-- No Version or groupId -->
причина все модули наследуют версию и groupId
у своих родителей. Иногда полезно или необходимо изменить модули groupId
но это исключение.
на что я перечитал об отдельных версий родителя. Это просто не имеет смысл, потому что это родитель их модулей, поэтому поместите его в ту же структуру и, конечно, те же VCS.
если вы хотите сделать некоторые версии конфигурации / плагинов, зависимости, которые должны использоваться для других проектов, а также сделать отдельный корпоративный pom.xml
, который является отдельным проектом и будет выпущен отдельно и т. д.
после завершения изменений структуры вы можете просто перейти в каталог parent-pom и сделать mvn clean package
или mvn release:prepare release:perform
от эта папка и все остальное будет проще.
Если вы публикуете POM, вам придется выпустить любые обновления, но вам не нужно вручную изменять версии POM - вы можете автоматически обновлять версии с помощью плагина версий или плагина выпуска. Я, как правило, предпочитаю плагин выпуска, поскольку он будет совершать SCM для вас тоже.
mvn versions:set
http://mojo.codehaus.org/versions-maven-plugin/
mvn release:prepare release:perform
http://maven.apache.org/plugins/maven-release-plugin/
ваш диспетчер репозиториев также может разрешить перезапись существующей версии, но лучше просто выпустить новую версию.
Я предпочитаю плоскую структуру модуля, поскольку она позволяет использовать родительскую папку для хранения общих файлов, например конфигурации checkstyle. Я также считаю полезным поделиться идентификатором группы между модулями, а затем назвать каталог модуля таким же, как artifactId.
вы представляете противоречащие требования. Вы хотите реструктурировать свой проект, но не можете перемещать вещи. Вы хотите упростить циклы развертывания и выпуска, но не хотите использовать одну версию.
учитывая, что изменения в одном модуле неизбежно повлияют на все зависимые модули, я бы использовал простую схему version'ING, где все субмодули наследуют версию своего родителя. выпуск maven: подготовка и выпуск циклов становятся простыми. Использовать примечания к выпуску чтобы отслеживать изменения и оправдывать пропуск ненужного тестирования неизмененных модулей (изменения в версии не изменяют вывод сборки/двоичного файла процесса сборки, поэтому вы можете использовать его в качестве основного аргумента).
удачи с вашим проектом.