понеділок, 14 вересня 2009 р.

Maven::Part #3

Multimodule projects

каждый pom.xml файл описывает build workflow для одного проекта, в конечной фазе которого мы имеем один артефакт установленный в локальный и удаленный репозитарий. однако Maven позволяет легко и удобно работать с многомодульными проектами. при этом задача управления зависимостями между внешними библиотеками и между модулями внтури проекта полностью решается самим Maven.

Особенности конфигурации

для того, чтобы сконфигурировть build workflow для multimodule project необходимо
  1. создать в корневом каталоге, общем для всех модулей, pom.xml файл родительского модуля, для которого указать
    ...
     <packaging>pom</packaging>
    ...
    такое значение артефакта указывается Maven на то, что данный проект является мета-проектом и не требует сборки конечного артефакта на выходе. в итоге в репозитариях будет просто сгенерирована мета-информация об этом проекте, без наличия конркетных артефактов.
  2. далее в родительском pom.xml файле мы должны определить конфигурацию модулей
    ...
     <modules>
      <module>module1_directory_name</module>
      <module>module2_directory_name</module>
    ...
      <module>moduleN_directory_name</module>
     </modules>
    ...
    где
    module_directory_name -- имя каталога, в котором находятся файлы конкретного модуля.
    Важно: имена модулей в родительском pom.xml и имена каталогов, в котором расположены файлы модуля должны быть идентичны. имена каталогов модулей обрабатываются как пути к этим каталогам. таким образом, если структура конкретного проекта предполагает взаимонезависимое расположение каталогов с модулями, то следует указывать их абсолютные или отностительные пути
  3. для pom.xml каждого из модулей, входящих в multimodule project необходимо указать
    ...
     <parent>
      <groupId>project_group_id</groupId>
      <actifactId>parent_artifact_id</artifactId>
      <version>project_version</version>
      [<relativePath>path_to_parent_pom.xml</relativePath>]
    ...
    где
    project_group_id -- идентификатор группы, в которой будут сохранены все артефакты проекта. в случае multimodel project может быть указана для родительского модуля и parent-секции модуля. для конкретных модулей наследуется из родительского, если не указана явно
    parent_artifact_id -- идентификатор артефакта родительского проекта. этот интификатор необходим в любом случае и для любого проекта. даже для мета-проекта, которым часто является родительский проект
    project_version -- текущая версия проекта. в случае multimodel project может быть указана для родительского модуля и parent-секции модуля. для конкретных модулей наследуется из родительского, если не указана явно
    relativePath -- относительный путь к родительскому pom.xml. его необходимо указать в том случае, если каталог уровнем выше каталога модуля, не содержит родительского pom.xml
Важно: родительский pom.xml может определять различные кастомизации стандартных и не стандартных плагинов, обшие для всех модулей. однако следует помнить, что каждая задача, определенная в родительском pom.xml проекта, будет выполнена для каждого модуля проекта.
есть предположение, что для версии Maven 2.2.1 данное поведение исправлено. но я еще не проверял этого в своих проектах