【问题标题】:Why is my target not getting executed?为什么我的目标没有被执行?
【发布时间】:2016-06-02 20:43:49
【问题描述】:

我正在尝试为部署做好准备,因此我想将正确的配置文件复制到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“Hello World!”并将 x.xml 文件从 A 复制到 B。我决定在 compile 阶段执行此操作,这意味着

mvn clean compile

实际上应该足以让target 被执行,但是.. 如果它有效,我就不会在这里。

问题:有人知道为什么没有执行吗?


正如评论中提到的,我可以/应该从build 中删除pluginManagement。但是,这会给我一个错误提示:

Plugin execution not covered by lifecycle configuration: org.apache.maven.plugins:maven-antrun-plugin:1.8:run (execution: compile, phase: compile)

我根据问题“How to solve “Plugin execution not covered by lifecycle configuration” for Spring Data Maven Builds”的答案添加了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>

我也看到了同样的情况:

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

【问题讨论】:

  • 移除&lt;pluginManagement&gt;元素,即放入build/plugins而不是build/pluginManagement部分。
  • @A.DiMatteo 我不得不添加它,因为否则 m2e 会识别另一个 question 中描述的错误。
  • 啊,评论太长了,我需要写一个答案.. ok
  • @A.DiMatteo 期待它:D
  • 除上述内容外,您永远不应该复制(不管如何)到src/,因为它受版本控制。此外,您正在做的是从 src/main/resources/ 复制,默认情况下由资源复制处理...所以无需添加 maven-antrun-plugin...

标签: maven m2e maven-antrun-plugin


【解决方案1】:

为了让 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 阶段将是比compile 更(语义正确且易于维护)的选择。查看official Build Lifecycle phases list 了解更多详情。关于prepare-package

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


更新
似乎不仅如上所述,prepare-package 阶段将是一个更好的选择,而且在这种情况下,它也是使 m2e 插件完全满意的正确阶段。

【讨论】:

  • Nit-pick 但我会选择&lt;phase&gt;prepare-package&lt;/phase&gt;,因为显然应该调用它来在包装中设置正确的配置。
  • @Tunaki 绝对是好点,我的重点是构建配置,但这绝对值得添加和澄清,我会相应地更新!
  • 如果我这样做 完全 就像你这样做就像把它放在 正下方 pluginManagement 然后我得到“插件执行不是被生命周期配置覆盖”错误..
  • @displayname 什么不起作用?我刚刚尝试了您的代码并获得了 HelloWorld!在控制台中。关于 Eclipse,阶段是其默认映射中的问题,将其更改为 prepare-package 解决了该问题。可以试试吗?
  • @A.DiMatteo 这就是问题所在!使用prepare-package 也对我有用。抱歉,我没有看到您已经更新了答案!
【解决方案2】:

POM Reference, Plugin Management:

  • 插件管理

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

这意味着在&lt;pluginManagement&gt; 中声明一个插件只是故事的一半。您也必须在 &lt;build&gt;/&lt;plugins&gt; 部分中声明它,才能真正执行其目标。

在你的情况下:

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

【讨论】:

  • 我已经用建议的解决方案更新了我的问题,但它仍然是一样的:/
  • 看来你的答案到目前为止是正确的,但另一个问题是阶段compile +1 反正。
猜你喜欢
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多