在开发过程中,我们的项目会存在不同的运行环境,比如开发环境(dev)、测试环境(test)、生产环境(prod),而我们的项目在不同的环境中,有的配置可能会不一样,比如数据源配置、日志文件配置、以及一些软件运行过程中的基本配置,那每次我们将软件部署到不同的环境时,都需要修改相应的配置文件,这样来回修改,很容易出错,而且浪费劳动力。
maven为我们提供了一种更加灵活的解决方案,就是 profile 功能。
先看一段 pom 文件中的 profile 定义。如下:
<profiles> <profile> <!-- 开发环境 --> <!-- 不同环境Profile的唯一id --> <id>dev</id> <properties> <!-- profiles.active 是自定义的字段(名字随便起),自定义字段可以有多个 --> <profiles.active>dev</profiles.active> </properties> </profile> <profile> <!-- 生成环境 --> <id>prod</id> <properties> <profiles.active>prod</profiles.active> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <!-- 测试环境 --> <id>test</id> <properties> <profiles.active>test</profiles.active> </properties> </profile> </profiles>
可以看到定义了多个 profile,每个 profile 都有唯一的 id,也包含 properties 属性。这里为每个 profile 都定义一个名为 profiles.active 的 properties,每个环境的值不同。当我们打包项目时,激活不同的环境,profiles.active 字段就会被赋予不同的值。
在正式介绍前,我们先看看项目的结构,如下图所示:
介绍一下,本项目在resouces目录下面创建了三个目录,分别为 dev(开发环境)、prod(生成环境) 和 test(测试环境)。这些目录下面存放属性文件,属性文件中保存项目需要的信息,如:数据库连接信息、调用远程API等信息。上图右边是maven的结构信息,其中显示3个profile,分别为“dev”、“prod”和“test”。
pom.xml 文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.huangx.maven</groupId> <artifactId>learn-maven-profile</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <!-- 定义maven的版本属性 --> <properties> <spring.version>4.3.12.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> <build> <!-- 资源打包 --> <resources> <resource> <directory>src/main/resources/</directory> <!-- 打包时先排除掉三个文件夹 --> <excludes> <exclude>dev/*</exclude> <exclude>prod/*</exclude> <exclude>test/*</exclude> </excludes> </resource> <resource> <!-- 这里是关键!根据不同的环境,把对应文件夹里的配置文件打包 --> <directory>src/main/resources/${profiles.active}</directory> </resource> </resources> </build> <profiles> <!-- 开发环境 --> <profile> <!-- 不同环境Profile的唯一id --> <id>dev</id> <properties> <!-- profiles.active是自定义的字段,自定义字段可以有多个 --> <profiles.active>dev</profiles.active> </properties> <activation> <!-- 标记为默认 profile --> <activeByDefault>true</activeByDefault> </activation> </profile> <!-- 生成环境 --> <profile> <id>prod</id> <properties> <profiles.active>prod</profiles.active> </properties> </profile> <!-- 测试环境 --> <profile> <id>test</id> <properties> <profiles.active>test</profiles.active> </properties> </profile> </profiles> </project>
注意上面的 <resource> 元素,必须要设置这些,可以根据自己的需要去调整。
在 IDEA 中的 maven 选项卡,勾选你要打包的 profile,然后执行 package 生命周期。如下图:
执行成功如下图:
根据上面的配置,你会发现 applicationContex.xml 文件中的 context:property-placeholder 配置飘红了,因为在项目的resources目录下面没有 applicationContext.xml 文件,该文件只存在打包好的target下面。如下图:
解决这个问题很简单,把我们几个属性文件中的共有属性提取处理啊,放到 resouces 下面的 application.properties 中,然后将 dev/prod/test 目录下面的 application.properties 改名为 env.properties,如下图:
最后,修改 applicationContex.xml 为如下:
<context:property-placeholder location="classpath:*.properties" />
参考资料: