Пропустить подмодуль во время сборки Maven - PullRequest
126 голосов
/ 29 ноября 2011

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

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

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

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

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

Ответы [ 5 ]

173 голосов
/ 27 ноября 2014

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

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

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

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

mvn -pl '!submodule1,!submodule2' install
mvn -pl -submodule1,-submodule2 install

РЕДАКТИРОВАТЬ Windows, похоже, не нравится одинарные кавычки, но это необходимо в bash; в Windows используйте двойные кавычки (спасибо @awilkinson)

mvn -pl "!submodule1,!submodule2" install
137 голосов
/ 29 ноября 2011

Конечно, это можно сделать с помощью профилей. Вы можете сделать что-то вроде следующего в вашем родительском 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

37 голосов
/ 23 мая 2012

Можно решить, какие проекты реакторов построить, указав аргумент командной строки -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

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


РЕДАКТИРОВАТЬ: как указано blackbuild , начиная с Maven 3.2.1 у вас новый -el флаг , исключающий проекты из реактора, аналогично тому, что -pl делает:

4 голосов
/ 29 ноября 2011

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

2 голосов
/ 17 января 2015

теперь в яме есть (с версии 1.1.1) флаг 'skip'.

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

    <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] Пропуск проекта

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...