Пропустіть підмодуль під час складання Maven


160

У нас є необхідність мати можливість пропустити підмодуль у певних середовищах.

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

Чи можна це зробити за допомогою налаштування профілю? Я трохи погуглився і подивився на інші питання / відповіді тут, і не знайшов хорошого рішення.

Я припускаю, що одним із варіантів є видалення цього підмодуля з батьківського pom.xmlповністю та просто додати ще один проект на нашому сервері CI, щоб просто створити цей модуль.

Пропозиції?


Чому б не 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


4
Відмінна відповідь! Я не знаю, чому у мене виникло стільки проблем з пошуком цього документа в документах Maven. Одне з пропозицій я б сказав, що оскільки я вважаю за краще тести інтеграції виконувати за замовчуванням, я додав activeByDefaultдо цього профілю, а потім довелося додати ще один порожній профіль (наприклад skip-integration-tests), щоб мати можливість їх пропустити.
denishaskin

7
чи можна це зробити, не дублюючи всі спільні речі?
JonnyRaa

7
Обережно, якщо ви використовуєте плагін maven-release, виявиться, що він не оновлює кількість версій підмодулів, які приховані за перемикачем профілю. Ви можете мати підмодулі з різними номерами версій до решти свого проекту ...
Ardesco

8
На жаль, користуючись профілем, ви не можете виключити модуль, згаданий раніше в головній частині <модулі> пам’яті. JIRA issues.apache.org/jira/browse/MNG-5230 (і вся структура пом) могла бути повністю реалізована набагато краще з трохи уважнішою думкою.
Ед Рендалл

2
чи справді це рішення працює? Принаймні, я не можу змусити його працювати. Схоже , у мене така ж проблема , як @EdRandall
Герр

231

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

EDIT Windows, як видається, не подобається одиничних цитат, але це потрібно вкрай; в Windows використовуйте подвійні лапки (спасибі @awilkinson)

mvn -pl "!submodule1,!submodule2" install

27
Важливо: якщо ви хочете виключити вкладений підмодуль, вам потрібно скористатися кваліфікованою версієюmvn -pl !com.acme:nestedmodule1
Leonard Brünings

3
Опція -pl потребує '[groupId]:' перед artifactId, тому ми повинні використовувати mvn -pl '!: Submodule-to-виключити' 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

будувати все. Видаліть елементи зі списку, щоб створити лише ті модулі, які вам подобаються.


EDIT: як вказувало blackbuild , з Maven 3.2.1 у вас є новий -elпрапор, який виключає проекти з реактора, аналогічно тому, що -plробить:


2
Дякую. Це добре спрацювало для мене. Також зауважте, що ви можете додати "-am" (AKA "- також зробити"), щоб також будувати проекти, необхідні модулям, які ви вказали.
Газ

1
Чудово! Я використовував mvn install -pl .для того, щоб встановити батьківський pom тільки в локальній репо-системі без модулів побудови.
Марцін

Також погляньте на jira.codehaus.org/browse/MNG-5230 . Тепер ви можете виключити проекти з реактора.
чорнобудування

1
Посилання MNG-5230 з моменту закриття codehaus.org: issues.apache.org/jira/browse/MNG-5230
Ed Randall

На жаль, він не працює транзитивно, тобто, якщо у мене є 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] Пропуск проекту

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.