Как исключить модуль из сборки реактора Maven? - PullRequest
86 голосов
/ 04 апреля 2011

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

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

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

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

Ответы [ 6 ]

116 голосов
/ 01 апреля 2014

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

См. Запрос этой функции: https://issues.apache.org/jira/browse/MNG-5230

70 голосов
/ 04 апреля 2011

Проще всего использовать 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>

Вам следует проверить способов активации профилей

42 голосов
/ 04 апреля 2011

Проекты для сборки также могут быть указаны в командной строке 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
20 голосов
/ 11 июля 2012

Я предполагаю, что вы хотите, чтобы сборка по умолчанию всегда собирала все, независимо от скорости, чтобы новые разработчики могли быстро начать работу, не разбираясь в 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>
7 голосов
/ 04 апреля 2011

Еще одна идея: модули Reactor могут быть вложенными, поэтому должна быть возможность сгруппировать модули быстрого и медленного построения в отдельные модули, а затем добавить еще один модуль-агрегатор, содержащий эти два модуля в качестве модулей. В этом случае ваш 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>
1 голос
/ 04 апреля 2011

Вы можете использовать maven profile .В нашей среде сборки мы создали профиль 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 вашего модуля, чтобы ускорить его.

...