运行 在 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 以获得一些提示。
部署 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 以获得一些提示。