Запуск определенной цели плагина Maven из командной строки в подмодуле проекта многомодульного реактора

Я ищу общую технику здесь, но давайте приведем конкретный пример. У меня есть многомодульный проект, и я хотел бы запустить exec:java цель из командной строки против одного из подмодулей моего проекта.

Я знаю, что один подход заключается в том, что я могу бежать mvn install на весь проект, а затем просто перейдите в каталог подмодулей, запустите exec:java команда из командной строки, и артефакты разрешены в моем локальном хранилище. Но работает mvn install все время становится довольно утомительным.

Что мне действительно нравится, так это умение бегать exec:java против реактора Maven, где classpath построен из активных модулей проекта в реакторе Maven. Проблема в том, что я не уверен, что это возможно. Наивный подход заключается в запуске exec:java Цель из корня проекта, но он пытается запустить плагин для каждого модуля в проекте, в отличие от целевого модуля, который меня интересует.

Любая идея? Я знаю, что мой мотивирующий пример был exec:java, но на самом деле есть целый ряд отдельных плагинов, которые я хотел бы время от времени запускать против моего проекта, выходя за рамки полного жизненного цикла сборки.

4 ответа

У меня есть многомодульный проект, и я хотел бы запустить exec:java плагин из командной строки против одного из подмодулей моего проекта.

Я не говорю, что это будет соответствовать вашему конкретному случаю использования, но можно выполнить цель для подмножества многомодульной сборки, используя -pl, --projects <arg> опция:

mvn exec:java -pl my-module

Я знаю, что один из подходов заключается в том, что я могу запустить "mvn install" для всего проекта, а затем просто зайти в каталог подмодуля, запустить команду exec:java из командной строки и разрешить артефакты в моем локальном репозитории.

Разрешение зависимостей действительно осуществляется через локальный репозиторий.

Что мне действительно нравится, так это умение бегать exec:java против реактора Maven, где classpath построен из активных модулей проекта в реакторе Maven.

Это не совсем то, что делает сборка реактора. Сборка реактора строит ориентированный граф модулей, выводит соответствующий порядок сборки из этого графика и запускает цель / фазу для модулей в вычисленном порядке. Сборка реактора не создает какой-либо "глобальной" траектории.

Наивный подход заключается в запуске exec:java Цель из корня проекта, но он пытается запустить плагин для каждого модуля в проекте, в отличие от целевого модуля, который меня интересует.

Ну, это ожидаемое поведение. Это просто не то, что вы на самом деле ищете.

Любая идея? Я знаю, что моим мотивирующим примером был exec:java, но на самом деле есть целый ряд отдельных плагинов, которые я хотел бы время от времени запускать против своего проекта, выходя за рамки полного жизненного цикла сборки.

Сборка реактора позволяет это сделать, но, как я писал, вы, похоже, ищете что-то другое. Может быть, если вы укажете свои точные потребности, я смогу дать лучший ответ.

Есть еще один способ, который позволяет вам выбрать несколько модулей для запуска плагина.

Многие плагины имеют skip опция, которую вы можете активировать в корневом проекте, установив его значение в true, Выполнение плагина будет по умолчанию пропущено для всех подмодулей. Субмодули, которые должны выполнить плагин, могут явно установить skip в false, Вам все еще нужно настроить любые необязательные атрибуты в корневом проекте.

Пример exec-maven-plugin с конфигурацией для exec:exec Цель:

<!-- root project -->
<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.3.2</version>
                <configuration>
                    <skip>true</skip>
                    <executable>java</executable>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>
<!-- any module that should execute the plugin -->
<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <configuration>
                <skip>false</skip>
                <!-- ... -->
            </configuration>
        </plugin>
   </plugins>
</build>

Несколько общий метод, который я использовал в этих обстоятельствах, заключается в определении профиля в рассматриваемом подмодуле POM, который связывает exec:java с фазой тестирования. Например:

<profiles>                                                                                                                      
  <profile>                                                                                                                     
    <id>test-java</id>                                                                                                          
    <build>                                                                                                                     
      <plugins>                                                                                                                 
        <plugin>                                                                                                                
          <groupId>org.codehaus.mojo</groupId>                                                                                  
          <artifactId>exec-maven-plugin</artifactId>                                                                            
          <version>1.1.1</version>                                                                                              
          <executions>                                                                                                          
            <execution>                                                                                                         
              <phase>test</phase>                                                                                               
              <goals>                                                                                                           
                <goal>java</goal>                                                                                               
              </goals>                                                                                                          
              <configuration>                                                                                                   
                <mainClass>com.foo.bar.MyClass</mainClass>                                                                      
              </configuration>                                                                                                  
            </execution>                                                                                                        
          </executions>                                                                                                         
        </plugin>                                                                                                               
      </plugins>                                                                                                                
    </build>                                                                                                                    
  </profile>                                                                                                                    
</profiles>                                                                                                                     

Затем из верхней части вашего проекта запустите:

mvn test -Ptest-java

Это установит межмодульный путь к классам, как обычно, и попытается запустить профиль test-java во всех ваших подпроектах. Но поскольку профиль определен только тем, о ком вы заботитесь, он будет единственным, что сделает что угодно.

Maven требуется совсем немного времени, чтобы перебрать другие подпроекты NOOPing, но это не так уж плохо.

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

Предложение Паскаля, вероятно, то, что вы хотите. Обратите внимание, что в настоящее время невозможно сначала скомпилировать зависимости, а затем выполнить (exec:exec и т. д.) приложением в одной команде Maven: https://jira.codehaus.org/browse/MNG-5059

Другие вопросы по тегам