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插件.
问题:如何实现这种情况?
而不是在年底执行该prepare-package阶段,你可能希望通过内不履行的package阶段,但之前的war包装(通过Maven的战争插件).
可能的解决方案是:
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帖子以获取一些提示.
| 归档时间: |
|
| 查看次数: |
2284 次 |
| 最近记录: |