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

160

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

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

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

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

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

denishaskin
источник
Почему не Maven Way? Это совершенно обоснованное требование ко мне.
MaDa
Хм. Теперь я не могу найти места, где люди, кажется, спорят с этим ... поэтому я обновил свой первоначальный вопрос, чтобы убрать утверждение, что это не "Путь Мейвена".
Денишаскин

Ответы:

149

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

Raghuram
источник
4
Отличный ответ! Я не знаю, почему у меня было так много проблем, чтобы найти это из документов Maven. Одно из предложений, которое я хотел бы сделать, заключается в том, что, поскольку я предпочитаю запуск интеграционных тестов по умолчанию, я добавил их activeByDefaultв этот профиль, а затем мне пришлось добавить еще один пустой профиль (например skip-integration-tests), чтобы можно было их пропустить.
Денишаскин 29.11.11
7
Есть ли способ сделать это без дублирования всех общих материалов?
JonnyRaa
7
Осторожно, если вы используете плагин maven-release-plugin, может показаться, что он не обновляет номер версии подмодулей, которые скрыты за переключателем профилей. Вы могли бы иметь
подмодули
8
К сожалению, используя профиль, вы не можете исключить модуль, упомянутый ранее в основной части <modules> модуля. JIRA questions.apache.org/jira/browse/MNG-5230 (и вся структура pom) могли бы быть полностью реализованы намного лучше, если бы они были немного более внимательны
Эд Рэндалл
2
это решение действительно работает? По крайней мере, я не могу заставить его работать. Похоже, у меня такая же проблема, как @EdRandall
Gerros
232

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
Александр Дюбрей
источник
27
Важно: если вы хотите исключить вложенный подмодуль, вам нужно использовать квалифицированную версиюmvn -pl !com.acme:nestedmodule1
Леонард Брюнингс
3
Опция -pl требует '[groupId]:' перед artifactId, поэтому мы должны использовать mvn -pl '!: Submodule-to-exclude' install
Honsen
4
Вы также можете использовать mvn -pl '!path/to/submodule/directory', не используя groupId и artifactId. Мой ответ работает, если submodule1и submodule2находятся в текущем каталоге.
Александр Дюбрей
Это не стоит также ничего , что если вы используете -plв mvn install, вы , вероятно , нужно использовать его для mvn deployа
majikman
39

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

skuro
источник
2
Спасибо. Это хорошо сработало для меня. Также обратите внимание, что вы можете добавить «-am» (AKA «--also-make»), чтобы также создавать проекты, необходимые для указанных вами модулей.
GaZ
1
Большой! Я использовал mvn install -pl .для того, чтобы установить родительский pom только в локальном репо без сборки модулей.
Марцин
Кроме того, взгляните на jira.codehaus.org/browse/MNG-5230 . Теперь вы можете исключить проекты из реактора.
Blackbuild
1
Ссылка на MNG-5230 с момента закрытия codehaus.org: Issues.apache.org/jira/browse/MNG-5230
Эд Рэндалл,
К сожалению, это не работает транзитивно, то есть, если у меня есть top / mod1 / mod2 и сборка сверху, -pl '! Mod2' вызывает ошибку.
zakmck
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 содержит подробное объяснение механизма профилирования .

Шри Шанкаран
источник
2

теперь в яме есть (с версии 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] Проект пропуска

twillouer
источник