Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

Самый простой способ - использовать 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>

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Это выполняется

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

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

mvn groupId:artifactId:goal -P quick

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