Как заставить Maven вести войну: взорвалась, но не война: война
У меня есть Maven pom, который использует <packaging>war</packaging>
. Но на самом деле, я не хочу строить war файл, я просто хочу, чтобы все зависимые банки собраны и был создан полный каталог развертывания.
Итак, я запускаю цель war:exploded
для создания каталога развертывания:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<configuration>
<webappDirectory>target/${env}/deploy</webappDirectory>
<archiveClasses>true</archiveClasses>
</configuration>
<goals>
<goal>exploded</goal>
</goals>
</execution>
</executions>
</plugin>
Беда в том, что файл войны все еще строится. Есть ли простой способ иметь <packaging>war</packaging>
выполнить цель war:exploded
вместо цели войны: война?
Или есть еще один простой способ сделать это?
Ответы
Ответ 1
В соответствии с встроенными привязками жизненного цикла для военной упаковки в фазе фаз упаковки: вызывается война mojo.
Вы можете вызвать предыдущую фазу "подготовить-пакет" - все действия будут выполнены и после этого вызова mojo war: exploded
mvn prepare-package war:exploded
Результаты будут такими же, как ваши, но не созданы войны.
Ответ 2
Решение довольно простое. Вам необходимо переопределить выполнение плагина войны по умолчанию, чтобы отключить его и добавить свое собственное исполнение (для взорванных):
<pluginManagement>
<plugins>
<plugin><!-- don't pack the war -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<executions>
<execution>
<id>default-war</id>
<phase>none</phase>
</execution>
<execution>
<id>war-exploded</id>
<phase>package</phase>
<goals>
<goal>exploded</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
Ответ 3
Единственный способ, с помощью которого я могу сделать то, что вы хотите, - установить упаковку pom (или создать пользовательскую упаковку) и связать требуемые цели с войной упаковки на соответствующие этапы жизненного цикла. Если вы отправляетесь на упаковку pom, вы можете использовать определение войны: военное исполнение в профиле, чтобы вы могли его упаковать, но вам нужно использовать build-helper-maven-plugin attach-artefact goal, чтобы прикрепить войну к pom.
Обратите внимание на этот подход, если вы хотите использовать любую другую обработку, связанную с войной, которая может вызвать проблемы.
привязки жизненного цикла для военной упаковки перечислены в Введение в жизненный цикл сборки (см. "Связывание жизненного цикла по умолчанию - упаковка ejb/ejb3/jar/par/rar/war" ).
Чтобы связать соответствующие плагины с упаковкой pom, вы должны сделать следующее:
<build>
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>process-resources</id>
<phase>process-resources</phase>
<goals>
<goal>resources</goal>
</goal>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compile-plugin</artifactId>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goal>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>process-test-resources</id>
<phase>process-test-resources</phase>
<goals>
<goal>testResources</goal>
</goal>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<id>test</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goal>
</execution>
</executions>
</plugin>
<!-- package not wanted, install and deploy already defined for pom packaging-->
<!--define war:war execution in a profile in case it is needed-->
Ответ 4
Я хотел бы обновить ответ на @Michael Wyraz и просто включить установки параметров пропуска в случае, если кто-то выполнит mvn clean install
build на верхнем уровне проекта с несколькими модулями, а один из подмодулей - веб-приложение.
Это находится внутри модуля войны:
<profiles>
<profile>
<id>war_explode</id>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>default-war</id>
<phase>none</phase>
</execution>
<execution>
<id>war-exploded</id>
<phase>package</phase>
<goals>
<goal>exploded</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>default-install</id>
<phase>none</phase>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>
</profiles>
Без установки пропустить сборку сбоя при попытке установить войну в папку .m2. Сообщение об ошибке выглядит следующим образом:
[INFO] --- maven-install-plugin:2.4:install (default-install) @ *** ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.4:install (default-install) on project ***: The packaging for this project did not assign a file to the build artifact -> [Help 1]
Выполняя mvn clean install -P war_explode
с помощью этих настроек (вложенных в профиль maven с именем war_explode), он завершает сборку без ошибок.
Ответ 5
Насколько я знаю (я все еще новичок в maven), это невозможно. Единственный жизненный цикл по умолчанию, который вы можете пропустить, - это "тест". Чтобы добраться до развертывания, вам нужно упаковать. Здесь вы можете прочитать все о порядке выполнения жизненного цикла по умолчанию: http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference