为什么我的目标没有被执行?

时间:2016-06-02 20:43:49

标签: maven m2e maven-antrun-plugin

我正在尝试为部署做好准备,因此我想将正确的配置文件复制到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>

应该{​​{1}}“Hello World!”并将 x.xml 文件从A复制到B.我决定在echo阶段执行此操作,这意味着

compile

实际上应该足以让mvn clean compile 执行但是......如果有效的话,我不会在这里。

问题:有人知道为什么这不会被执行吗?

正如评论中所述,我可以/应该从target删除pluginManagement。但是,这会给我一个错误说:

build

我根据问题“How to solve “Plugin execution not covered by lifecycle configuration” for Spring Data Maven Builds”的回答添加了Plugin execution not covered by lifecycle configuration: org.apache.maven.plugins:maven-antrun-plugin:1.8:run (execution: compile, phase: compile)

下面的解决方案是提供相同的“插件执行未被生命周期配置覆盖”错误

pluginManagement

我看到同样的事情:

<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>

2 个答案:

答案 0 :(得分: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配置或命令行执行)需要执行此插件时,默认情况下应用此版本并且此配置执行
  • 然后,Maven和Eclipse之间的m2e不那么完美的集成会对这个插件配置感到高兴,但是除非我们有效地声明它,否则不会发生插件执行
  • 通过plugins部分,我们最终确实定义了我们的构建,告诉Maven将此插件添加到其构建计划中。无需指定版本,配置或执行,因为我们已将它们定义到pluginManagement(即插件管理),这将作为默认配置/行为应用。

有关插件和插件管理之间区别的更多详细信息,请查看reference post on SO: Maven: what is pluginManagement

进一步注意相关phase的执行:prepare-package阶段比({1}}更多(语义正确,维护友好)选择。查看official Build Lifecycle phases list了解更多详情。关于compile

  

在实际包装之前执行准备包装所需的任何操作。

<强>更新
看来不仅如上所述prepare-package阶段是更好的选择,而且在这种情况下,使m2e插件完全开心也是正确的阶段。

答案 1 :(得分:1)

请参阅POM Reference, Plugin Management

  
      
  • <强> pluginManagement

         

    但是,这只配置了子节点中plugins元素中实际引用的插件。

  •   

这意味着在<pluginManagement>中声明一个插件只是故事的一半。您还必须在<build>/<plugins>部分中声明它,以实际执行其目标。

在你的情况下:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-antrun-plugin</artifactId>
    </plugin>
  </plugins>
</build>