Запуск определенной цели плагина Maven из командной строки в субмодуле проекта многомодульного реактора - PullRequest
32 голосов
/ 11 августа 2010

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

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

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

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

Ответы [ 4 ]

35 голосов
/ 11 августа 2010

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

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

mvn exec:java -pl my-module

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

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

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

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

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

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

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

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

18 голосов
/ 19 октября 2014

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

Многие плагины имеют опцию 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>
5 голосов
/ 11 ноября 2011

Несколько общий метод, который я использовал в этих обстоятельствах, заключается в определении профиля в рассматриваемом подмодуле 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

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

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

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

1 голос
/ 23 ноября 2011

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

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