Пропустить подмодуль во время сборки Maven

Нам нужно иметь возможность пропускать подмодуль в определенных средах.

Данный модуль содержит тесты интеграции и занимает полчаса. Поэтому мы хотим включить его при создании на CI-сервере, но когда разработчики строят локально (и тесты запускаются), мы хотим пропустить этот модуль.

Есть ли способ сделать это с настройкой профиля? Я сделал несколько поисковых запросов и посмотрел на другие вопросы/ответы здесь и не нашел хорошего решения.

Я предполагаю, что один из вариантов - полностью удалить этот субмодуль из родительского pom.xml и просто добавить еще один проект на нашем сервере CI, чтобы просто создать этот модуль.

Предложения?

Ответ 1

Конечно, это можно сделать с помощью профилей. Вы можете сделать что-то вроде следующего в родительском pom.xml.

  ...
   <modules>
      <module>module1</module>
      <module>module2</module>  
      ...
  </modules>
  ...
  <profiles>
     <profile>
       <id>ci</id>
          <modules>
            <module>module1</module>
            <module>module2</module>
            ...
            <module>module-integration-test</module>
          </modules> 
      </profile>
  </profiles>
 ...

В вашем CI вы будете запускать maven с профилем ci, т.е. mvn -P ci clean install

Ответ 2

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

mvn -pl '!submodule-to-exclude' install

Будьте осторожны в bash персонаже! является специальным символом, поэтому вам либо нужно сделать одиночную цитату (например, я), либо избежать ее с помощью символа обратной косой черты.

Синтаксис для исключения нескольких модулей такой же, как включение

mvn -pl '!submodule1,!submodule2' install

EDIT Windows не похоже на одиночные кавычки, но это необходимо в bash; в Windows используйте двойные кавычки (спасибо @awilkinson)

mvn -pl "!submodule1,!submodule2" install

Ответ 3

Можно решить, какие проекты реакторов нужно построить, указав аргумент командной строки -pl:

$ mvn --help
[...]
 -pl,--projects <arg>                   Build specified reactor projects
                                        instead of all projects
[...]

Он принимает список параметров, разделенных запятыми, в одной из следующих форм:

  • относительный путь к папке, содержащей POM
  • [groupId]:artifactId

Таким образом, учитывая следующую структуру:

project-root [com.mycorp:parent]
  |
  + --- server [com.mycorp:server]
  |       |
  |       + --- orm [com.mycorp.server:orm]
  |
  + --- client [com.mycorp:client]

Вы можете указать следующую командную строку:

mvn -pl .,server,:client,com.mycorp.server:orm clean install

построить все. Удалите элементы в списке, чтобы создать только те модули, которые вам нравятся.


EDIT: как blackbuild указал, что с Maven 3.2.1 у вас есть новый флаг -el, который исключает проекты из реактора, аналогично тому, что -pl делает:

Ответ 4

Понятие мультимодульных проектов предназначено для удовлетворения потребностей созависимых сегментов проекта. Такой клиент зависит от услуг, которые, в свою очередь, зависят от программ EJB или доступа к данным. Таким образом вы можете группировать тесты непрерывной интеграции (CI). Я бы рационализировал это, сказав, что тесты CI должны быть заблокированы с изменениями логики приложения.

Предположим, что ваш проект структурирован как:

project-root
  |
  + --- ci
  |
  + --- client
  |
  + --- server

project-root/pom.xml определяет модули

<modules>
  <module>ci</module>
  <module>client</module>
  <module>server</module>
</modules>

ci/pom.xml определяет такие профили, как:

... 
<profiles>
  <profile>
    <id>default</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <skip>true</skip>
       </configuration>
     </plugin>
  </profile>
  <profile>
    <id>CI</id>
    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <skip>false</skip>
       </configuration>
     </plugin>
  </profile>
</profiles>

Это приведет к прохождению тестов Maven в этом модуле, за исключением случаев, когда активен профиль с именем CI. Ваш сервер CI должен быть проинструктирован выполнить mvn clean package -P CI. Веб-сайт Maven имеет подробное объяснение механизма профилирования.

Ответ 5

теперь (из версии 1.1.1) флаг "пропустить" в яме.

Итак, вы можете делать такие вещи, как:

    <profile>
        <id>pit</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.pitest</groupId>
                    <artifactId>pitest-maven</artifactId>
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>

в вашем модуле, и яма пропустит

[INFO] --- pitest-maven: 1.1.3: mutationCoverage (default-cli) @module-selenium --- [INFO] Пропуск проекта