Почему моя цель не выполняется?

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