为不同环境建造
为不同的环境构建相同的工件一直很烦人。您有多个环境,例如测试和生产服务器,或者可能是一组运行具有不同配置的相同应用程序的服务器。在本指南中,我将解释如何使用配置文件来构建和打包为特定环境配置的工件。有关配置文件概念的更深入解释,请参阅构建配置文件简介。
笔记:
- 本指南假定您具有基本的 Maven 知识。
- 它将展示一种配置 Maven 以仅解决简单配置设置的方法。通过简单的配置设置,我的意思是您只有一个文件或一小组文件,这些文件因每个环境而异。还有其他更好的方法来处理二维和多维配置问题。
此示例假定使用标准目录布局。
pom.xml src/ main/ java/ resources/ test/ java/
下面src/main/resources
有三个文件:
environment.properties
- 这是默认配置,默认会打包在工件中。environment.test.properties
- 这是测试环境的变体。environment.prod.properties
- 这与测试变体基本相同,将在生产环境中使用。在项目描述符中,您需要配置不同的配置文件。此处仅显示测试配置文件。
<profiles> <profile> <id>test</id> <build> <plugins> <plugin> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <phase>test</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <delete file="${project.build.outputDirectory}/environment.properties"/> <copy file="src/main/resources/environment.test.properties" tofile="${project.build.outputDirectory}/environment.properties"/> </tasks> </configuration> </execution> </executions> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skip>true</skip> </configuration> </plugin> <plugin> <artifactId>maven-jar-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>jar</goal> </goals> <configuration> <classifier>test</classifier> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> .. Other profiles go here .. </profiles>
此代码段中配置了三件事:
- 它将 antrun 插件配置为在测试阶段执行 run 目标,它将
environment.test.properties
文件复制到environment.properties
. - 它将配置测试插件以在构建测试和生产工件时跳过所有测试。这很有用,因为您可能不想针对生产系统运行测试
- 它将 JAR 插件配置为使用“测试”分类器创建“附加”JAR。
要激活此配置文件执行
mvn -Ptest install
,Maven 将执行配置文件中的步骤以及正常步骤。从这个构建中,您将获得两个工件,“foo-1.0.jar”和“foo-1.0-test.jar”。这两个罐子将相同。
- 它将 antrun 插件配置为在测试阶段执行 run 目标,它将
注意事项
- 目前 Maven 不允许项目构建只生成附加的工件。(即它还必须产生一个“主要”工件)这会导致打包和安装两个相等的 JAR。JAR 插件可能还应该得到对这个用例的改进支持,因为两个不同的输出目录将用作构建 JAR 的基础。
- 删除任务的使用可能看起来有点奇怪,但需要确保复制任务实际上会复制文件。复制任务将查看源文件和目标文件的时间戳,只有在复制文件时它才会知道实际的源文件可能与上次执行时不同。
- 构建后,测试配置将位于目标/类中,并且不会被覆盖,因为资源插件使用相同的时间戳检查,因此您应该在使用配置文件执行 Maven 后始终进行清理。
- 由于上述原因,您必须一次只在一次执行中为单个环境构建工件,并且在更改配置文件开关时执行“mvn clean”。如果没有,您可能会得到带有一组混合配置文件的工件。