在打包战争之前,在maven构建阶段运行ant任务?

时间:2016-03-23 15:18:09

标签: maven maven-3 pom.xml maven-war-plugin maven-antrun-plugin

在部署webapp时,我需要连接一些文件,目前这是通过ant任务实现的。我正在尝试使用以下内容在maven构建过程中运行此任务:

<plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.7</version>
    <executions>
        <execution>
            <phase>package</phase>
            <configuration>
                <target>
                    <move file="${project.build.directory}/${project.name}-${project.version}/WEB-INF/classes/log4j.dev.properties"
                        tofile="${project.build.directory}/${project.name}-${project.version}/WEB-INF/classes/log4j.properties" />

                    <move file="${project.build.directory}/${project.name}-${project.version}/WEB-INF/classes/hibernate.cfg.dev.xml"
                        tofile="${project.build.directory}/${project.name}-${project.version}/WEB-INF/classes/hibernate.cfg.xml" />
                    <delete>
                        <fileset dir="${project.build.directory}/${project.name}-${project.version}/WEB-INF/classes/"
                            includes="**/hibernate.cfg.*.xml" />
                        <fileset dir="${project.build.directory}/${project.name}-${project.version}/WEB-INF/classes/"
                            includes="**/log4j.*.properties" />     
                    </delete>
                </target>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>

上述操作失败,因为文件尚未复制/删除到目标目录中。如果我将阶段设置为“package”,则ant任务运行正常并且所有文件都被复制/删除,但是因为在运行ant目标之前已经构建了.war,所以没有任何帮助。

基本上,我需要在准备包阶段结束时运行我的蚂蚁目标。

看了Lifecycle Reference我无法解决如何将更细粒度的目标暴露给antrun插件。

问题:如何实现这种情况?

1 个答案:

答案 0 :(得分:6)

而不是在prepare-package阶段结束时执行它,您可能希望在package阶段执行它,但在<{strong> war包装之前执行它(通过Maven War Plugin)。

可能的解决方案是:

  • 禁用默认的Maven War Plugin
  • package阶段
  • 中添加您的执行
  • package阶段
  • 添加新的Maven War Plugin执行

由于Maven将通过声明顺序在同一阶段执行插件,因此您将先执行ant执行,然后执行war打包。

执行以下操作:

mvn help:effective-pom

您可以检查默认情况下,war包装已经为我们配置了Maven War Plugin执行:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.2</version>
    <executions>
        <execution>
            <id>default-war</id>
            <phase>package</phase>
            <goals>
                <goal>war</goal>
            </goals>
        </execution>
    </executions>
</plugin>

然后我们可以在maven-antrun-plugin声明之后向我们的POM添加以下内容:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.2</version>
    <executions>
        <execution>
            <id>default-war</id>
            <phase>none</phase>
            <goals>
                <goal>war</goal>
            </goals>
        </execution>
        <execution>
            <id>package-war</id>
            <phase>package</phase>
            <goals>
                <goal>war</goal>
            </goals>
        </execution>
    </executions>
</plugin>

注意:我们实际上使用相同的默认执行ID并将其绑定到非现有阶段(none),因此禁用它;然后我们添加一个新的执行(package-war id),它将在你maven-antrun-plugin执行后由Maven执行,但仍然在包阶段。

请注意,声明顺序非常重要以实现您的目标,因此最好还添加评论(对于同事,如果有的话,以及将来自己)。

进一步注意:您似乎正在使用类似prod的文件交换dev文件,您可以通过Maven profilesMaven resource filtering委托属性来实现相同的环境之间的差异,从而避免交换文件。

如果对此替代方法感兴趣,请检查this SO post以获取一些提示。