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

Mer*_*cer 2 pom.xml maven-3 maven 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>
Run Code Online (Sandbox Code Playgroud)

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

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

看过生命周期参考我无法研究如何将更细粒度的目标暴露给antrun插件.

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

A_D*_*teo 6

而不是在年底执行该prepare-package阶段,你可能希望通过内不履行的package阶段,但之前war包装(通过Maven的战争插件).

可能的解决方案是:

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

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

执行以下操作:

mvn help:effective-pom
Run Code Online (Sandbox Code Playgroud)

您可以检查默认情况下,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>
Run Code Online (Sandbox Code Playgroud)

然后,我们可以在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>
Run Code Online (Sandbox Code Playgroud)

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

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


进一步说明:您似乎正在使用类似prod的文件交换dev文件,您可以通过Maven配置文件Maven资源过滤委托属性值来实现环境之间的差异,从而避免交换文件.

如果对这种替代方法感兴趣,请查看此SO帖子以获取一些提示.