运行 在 war 打包之前的 maven 构建阶段的 ant 任务?

Run ant task in maven build phase before war is packaged?

部署 web 应用程序时,我需要连接一些文件,目前这是通过 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>

以上失败,因为文件尚未 copied/deleted 进入目标目录。如果我将阶段设置为 "package",ant 任务 运行 很好并且所有文件都是 copied/deleted,但它没有帮助,因为 .war 已经在蚂蚁目标是 运行.

基本上,我需要 运行 我的 ant 目标接近准备包阶段的末尾。

看过 Lifecycle Reference 我无法锻炼如何将更细粒度的目标公开给 ant运行 插件。

问题:如何实现这个场景?

而不是在 prepare-package 阶段结束时执行它,您可能希望在 package 阶段内执行它,但是 war 打包(通过 Maven War 插件)。

可能的解决方案是:

  • 禁用默认 Maven War 插件
  • package 阶段添加您的执行
  • package 阶段添加一个新的 Maven War 插件执行

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

正在执行以下操作:

mvn help:effective-pom

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

<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 执行,但仍在打包阶段。

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


进一步注意:您似乎正在用类似产品的文件交换开发文件,您可能可以通过 Maven profiles and Maven resource filtering 将环境之间的差异委托给属性值来实现相同的目的,从而避免交换文件。

如果对这种替代方法感兴趣,请查看 this SO post 以获得一些提示。