Выполнение определенной цели плагина Maven из командной строки в подмодуле многомодульного проекта реактора
Я ищу здесь общую технику, но дайте конкретный пример. У меня есть многомодульный проект, и я хотел бы запустить цель exec:java
из командной строки в отношении одного из подмодулей моего проекта.
Я знаю, что один подход заключается в том, что я могу запустить mvn install
для всего проекта, а затем просто зайти в каталог подмодуля, запустить команду exec:java
из командной строки и разрешить артефакты для моего локального репозитория. Но запуск mvn install
все время становится довольно утомительным.
Мне бы очень хотелось, чтобы была возможность запускать exec:java
против реактора Maven, где classpath построен из активных модулей проекта в реакторе Maven. Проблема в том, что я не уверен, что это возможно. Наивный подход состоит в том, чтобы запустить цель exec:java
из корня проекта, но это пытается запустить плагин против каждого модуля в проекте, в отличие от целевого модуля, который мне интересен.
Любая идея? Я знаю, что мой мотивирующий пример был exec:java
, но на самом деле существует целый ряд одиночных целей плагина, которые я хотел бы время от времени выполнять против моего проекта вне сферы жизненного цикла полной сборки.
Ответы
Ответ 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