Почему моя цель не выполняется?
Я пытаюсь подготовиться к развертыванию и поэтому хочу скопировать правильные файлы конфигурации в WEB-INF/classes/
прежде чем все будет упаковано в файл WAR для развертывания или разработки.
В конце я хочу выполнять задачи развертывания всякий раз, когда я звоню
mvn glcoud:deploy
- когда мне нужны файлы конфигурации развертывания - и задачи разработки, когда что-то еще выполняется в каталоге моего проекта.
На данный момент я еще не решил, как именно я это сделаю, но прежде всего я пытаюсь выполнить такую "пустышку". К сожалению, это не работает.
Это профиль, который я настроил в pom.xml
:
<profile>
<id>default-profile</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<configuration>
<target>
<echo message="Hello World!"/>
<copy file="src/main/resource/x.xml" todir="src/main" />
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>
Предполагается echo
"Привет, мир!" и скопировать файл x.xml из A в B. Я решил сделать это в compile
фаза, которая означает
mvn clean compile
на самом деле должно быть достаточно, чтобы получить target
казнен, но.. я не был бы здесь, если бы это работало.
Вопрос: Кто-нибудь знает, почему это не выполняется?
Как упоминалось в комментарии, я мог / должен удалить pluginManagement
от build
, Тем не менее, это даст мне ошибку, сказав:
Plugin execution not covered by lifecycle configuration: org.apache.maven.plugins:maven-antrun-plugin:1.8:run (execution: compile, phase: compile)
я добавил pluginManagement
согласно ответу на вопрос " Как решить"Выполнение плагина, не охватываемое конфигурацией жизненного цикла"для Spring Data Maven Builds".
Решение ниже дает ту же ошибку "Выполнение плагина, не охваченное конфигурацией жизненного цикла"
<profile>
<id>default-profile</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<!-- -->
</executions>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
</plugin>
</plugins>
</build>
</profile>
и я вижу то же самое для:
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>default-profile</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<!-- -->
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>
<profiles>
2 ответа
Чтобы сделать m2e счастливым и при этом соответствовать вашим требованиям, попробуйте следующее:
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<configuration>
<target>
<echo message="Hello World!"/>
<copy file="src/main/resource/x.xml" todir="src/main" />
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
</plugin>
</plugins>
</build>
Обратите внимание на дополнительные plugins
раздел, который в основном просто повторяет artifactId
плагина.
Что тут происходит:
- Через
pluginManagement
В разделе, которое мы говорим Maven: всякий раз, когда сборка (через конфигурацию POM или выполнение из командной строки) должна выполнить этот плагин, тогда примените эту версию по умолчанию, и эта конфигурация выполняет - Тогда не идеальная интеграция m2e между Maven и Eclipse будет рад этой конфигурации плагина, однако выполнение плагина никогда не произойдет, если мы не объявим об этом эффективно.
- Через
plugins
В этом разделе мы в конечном итоге действительно определяем нашу сборку, предлагая Maven добавить этот плагин в план сборки. Не нужно указывать версию, конфигурацию или выполнение, так как мы уже определили их вpluginManagement
(то есть управление плагинами), которое будет применяться в качестве конфигурации / поведения по умолчанию.
Для получения более подробной информации о разнице между плагинами и pluginManagement, посмотрите справочный пост на SO: Maven: что такое pluginManagement.
Дальнейшее примечание о связанных phase
для такого исполнения: prepare-package
этап будет более (семантически правильным и удобным для обслуживания) выбором, чем compile
, Проверьте официальный список этапов Build Lifecycle для более подробной информации. Что касается prepare-package
:
выполнить любые операции, необходимые для подготовки пакета до фактической упаковки.
Обновить
Похоже, что не только как описано выше prepare-package
Фаза была бы лучшим выбором, но это также правильная фаза, чтобы в этом случае плагин m2e был совершенно счастлив.
См. POM Reference, Управление плагинами:
pluginManagement
Тем не менее, это только настраивает плагины, на которые фактически ссылаются в элементе plugins в дочерних элементах.
Это означает, что объявление плагина в <pluginManagement>
это только половина истории. Вы должны объявить это в <build>/<plugins>
раздел, чтобы на самом деле выполнить свою цель.
В твоем случае:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
</plugin>
</plugins>
</build>