在部署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插件。
问题:如何实现这种情况?
答案 0 :(得分:6)
而不是在prepare-package
阶段结束时执行它,您可能希望在package
阶段执行它,但在<{strong> war
包装之前执行它(通过Maven War Plugin)。
可能的解决方案是:
package
阶段package
阶段由于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 profiles和Maven resource filtering委托属性来实现相同的环境之间的差异,从而避免交换文件。
如果对此替代方法感兴趣,请检查this SO post以获取一些提示。