Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

mvn exec:java -pl my-module

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

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

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

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

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

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

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

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

Ответ 2

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

Многие плагины имеют параметр 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>

Ответ 3

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

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

Ответ 4

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