Как реструктурировать многомодульный проект 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 проблемы для меня.

  1. каждый раз, когда мне нужно изменить версию на свойство в родителе, я должен обновить номер версии parent-pom и все дочерние модули версии parent pom и все дочерние модули версии самих себя (так как родитель измененный.)
  2. всякий раз, когда мне нужно развернуть цикл выпуска, 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: подготовка и выпуск циклов становятся простыми. Использовать примечания к выпуску чтобы отслеживать изменения и оправдывать пропуск ненужного тестирования неизмененных модулей (изменения в версии не изменяют вывод сборки/двоичного файла процесса сборки, поэтому вы можете использовать его в качестве основного аргумента).

удачи с вашим проектом.