构建项目是一个麻烦的事,因为项目运行的环境有开发,测试,生产环境等等。不同的环境下的各种配置又不一样。传统的做法是每当打一个war包时去根据它要运行的环境去修改相应的配置信息,但是人工改动是不可靠的,尤其是当配置信息很多的时候。数据库连接信息、redis配置信息、短信接口配置、其他依赖的服务地址等等,这么多的信息修改错了一项,项目都不能完全正常的运行了。幸运的是我们可以依赖maven的profile属性去配置好各种配置信息,在打包的时候只要指定一个参数就能够按照我们设想构建出相应环境下的war包。
假设这是Java的一个web项目,里面的数据库的配置信息会根据不同的运行环境变化而变化。
1. 添加会根据不同的环境变化的配置信息
我们的src/main/resources/jdbc.properties文件如下:
jdbc.driver=${profile.jdbc.driver}
jdbc.url=${profile.jdbc.url}
jdbc.name=${profile.jdbc.name}
jdbc.password=${profile.jdbc.password}
这里我们用${name}这样的方式来替换上述配置中的value,比如${profile.jdbc.name}来替换了我的数据库用户名。这里的名称可以随意命名,只要和后续步骤中保存一致就可以。
但是不要和spring配置中的一样,那样的话sping中配置就会在打包时也被替换成真实环境下的配置,虽然那样不影响运行,但是jdbc.properties就没有意义了。所以这里统一加上了profile.的前缀。
2. 添加profile属性
在pom.xml中添加如下配置信息:
<profiles>
<profile>
<id>dev</id>
<properties>
<profile.jdbc.driver>com.mysql.jdbc.Driver</profile.jdbc.driver>
<profile.jdbc.url>jdbc:mysql://localhost:3306/dev</profile.jdbc.url>
<profile.jdbc.name>dev</profile.jdbc.name>
<profile.jdbc.password>dev-password</profile.jdbc.password>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<profile.jdbc.driver>com.mysql.jdbc.Driver</profile.jdbc.driver>
<profile.jdbc.url>jdbc:mysql://192.168.10.100:3306/test</profile.jdbc.url>
<profile.jdbc.name>test</profile.jdbc.name>
<profile.jdbc.password>test-password</profile.jdbc.password>
</properties>
</profile>
</profiles>
上述配置添加了一个profiles属性,profiles下有两个profile配置,每个profile包含了id和properties两个属性,其中properties中可以包含各种我们想要配置的属性。这里我配置了在jdbc.properties有关数据库连接的信息。这里我们配置了dev和test两个profile,它们的数据库配置信息各不相同。
3. 添加profile属性
在pom.xml的build标签下中添加如下配置:
<build>
<finalName>maven-profile</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
关于resources这个标签的用途不是这里的重点,这里我们只关注我们配置的这两个属性:directory和filtering。上述配置是在src/main/resources这个资源文件目录下开启资源过滤的功能。
4. 打包构建
配置完上述三项之后,我们运行如下命令:
mvn clean install -P dev
然后查看war包WEB-INF/classes/jdbc.properties:
jdbc.driver=com.mysql.profile.jdbc.Driver
jdbc.url=profile.jdbc:mysql://localhost:3306/dev
jdbc.name=dev
jdbc.password=dev-password
这里的-P dev指定了开启该项目的一个profile,就是说我们第2步中配置的id为dev的这个profile的properties中的各项属性就会在这个项目中生效:
profile.jdbc.driver=com.mysql.profile.jdbc.Driver
profile.jdbc.url=profile.jdbc:mysql://localhost:3306/dev
profile.jdbc.name=dev
profile.jdbc.password=dev-password
所以jdbc.properties中的属性就会被替换掉。
同理,我们在打包时可以通过替换-P来随意的切换我们的运行环境。
5. 配置默认的环境信息
通过以下配置,不用-P默认就是打包dev的配置信息:
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<profile.jdbc.driver>com.mysql.profile.jdbc.Driver</profile.jdbc.driver>
<profile.jdbc.url>profile.jdbc:mysql://localhost:3306/dev</profile.jdbc.url>
<profile.jdbc.name>dev</profile.jdbc.name>
<profile.jdbc.password>dev-password</profile.jdbc.password>
</properties>
</profile>
总结
我们在上述的第3步的配置中指定了在src/main/resources下开启了资源过滤,所以该目录下的相应的${name}属性就会被maven中的属性所代替.而通过-P我们激活了第2步中的相应的profile,该profile中的属性就可以被我们使用,所以在打包时我们在第1步中所配置的数据库信息就会根据${name}被替换成profile中的相应属性。