Как исключить модуль из сборки реактора Maven?


у нас есть проект Maven 2 с большим количеством модулей в нем. Пример:

<modules>
  <module>common</module>
  <module>foo</module>
  <module>data</module>
  <module>bar</module>
  ... more ...
</module>

предположим, что модуль "данные" занимает много времени для сборки, и мы хотим исключить его, когда проект строится сервером CI. В настоящее время мы используем два пом.xml-файлы для достижения этой цели. Один имеет все модули в нем, а другой имеет все модули, кроме тех, которые могут быть оставлены для CI. Но это очень раздражает, потому что иногда мы забываем поставить новый модуль в и файлы.

есть ли решение, которое не требует двух отдельных списков модулей?

6 77

6 ответов:

самый простой может быть использование profiles такой:

<project>
  ...
  <modules>
    <module>common</module>
    <module>foo</module>
    <module>bar</module>
  <modules>
  ...
  <profiles>
    <profile>
      <id>expensive-modules-to-build</id>
      <modules>
        <module>data</module>
      </modules>
    </profile>
  </profiles>
</project>

затем вы должны проверить способы активации профилей

С Maven 3.2.1, теперь вы можете использовать -pl !<module_name>,!<module_name> чтобы исключить некоторые модули из сборки реактора.

смотрите этот запрос функции:https://jira.codehaus.org/browse/MNG-5230

проекты для сборки также могут быть указаны в командной строке mvn. Это устранит необходимость в отдельном pom, но вместо этого вам придется менять конфигурацию CI каждый раз, когда появляется новый модуль.

-pl,--projects <arg>                Comma-delimited list of specified
                                    reactor projects to build instead
                                    of all projects. A project can be
                                    specified by [groupId]:artifactId
                                    or by its relative path.

возможно сочетание этого флага и --also-make-dependents или --also-make снова уменьшить эту нагрузку.

-am,--also-make                     If project list is specified, also
                                    build projects required by the
                                    list
-amd,--also-make-dependents         If project list is specified, also
                                    build projects that depend on
                                    projects on the list

Я предполагаю, что вы хотите, чтобы сборка по умолчанию всегда создавала все, независимо от скорости, чтобы новые разработчики могли быстро начать работу, не понимая много о POM. Вы можете использовать такие профили:

<modules>
    <module>common</module>
    <module>foo</module>
    <module>bar</module>
  </modules>
  ...
  <profiles>
    <profile>
      <id>expensive-modules-to-build</id>
      <activation>
         <activeByDefault>true</activeByDefault>
      </activation>
      <modules>
        <module>data</module>
      </modules>
    </profile>
  </profiles>
</project>

проблема в том, что если разработчик задает другой профиль в командной строке, то expensive-modules-to-build не входит (если разработчик также не указывает его). Это усложняет запоминание того, какие профили должны быть включенный.

вот хакерский способ обойти это. Оба профиля всегда включены, потому что pom.XML-файл всегда существует. Поэтому, чтобы исключить дорогие модули, вы можете использовать -P!full-build в командной строке.

<profiles>
    <profile>
        <id>full-build</id>
        <activation>
            <file>
                <exists>pom.xml</exists>
            </file>
        </activation>
        <modules>
            <module>data</module>
        </modules>
    </profile>
    <profile>
        <id>short-build</id>
        <activation>
            <file>
                <exists>pom.xml</exists>
            </file>
        </activation>
        <modules>
           <module>common</module>
           <module>foo</module>
           <module>bar</module>
        </modules>
    </profile>
</profiles>

еще одна идея: модули реактора могут быть вложенными, поэтому должно быть возможно группировать ваши быстрые и медленные модули сборки в отдельные POM, а затем добавить еще один агрегатор pom, содержащий эти два модуля. Затем ваш сервер CI может ссылаться только на pom, содержащий модули быстрого построения.

<artifactId>fast</artifactId>
<modules>
    <module>fast-a</module>
    <module>fast-b</module>
    <module>fast-c</module>
</module>

<artifactId>all</artifactId>
<modules>
    <module>fast</module>
    <module>slow</module>
</module>

вы могли бы использовать maven профили. В нашей среде сборки, мы создали профиль quick это отключает многие плагины и выполнение тестов.

Это делается

    <profile>
        <id>quick</id>
        <properties>
            <skipTests>true</skipTests>
            <!-- others... -->
        </properties>   
        <build>
            <plugins>
                 <!-- configuration... -->
            </plugins>
        </build>
    </profile>

и затем мы вызываем maven следующим образом

mvn groupId:artifactId:goal -P quick

вы можете отключить компиляцию и другие стандартные плагины в pom вашего модуля, чтобы ускорить его.