---
layout: post
title: Spring的profile机制介绍
category: 技术
tags: Spring
keywords:
description: Spring的profile机制介绍
---
{:toc}
## 目标
因spring在使用中,比如连接数据库,缓存等属性配置在不同的环境中有所不同,而且开发人员可能再本地开发环境,测试环境甚至是生产环境间切换。尤其是本地开发环境和测试环境切换频繁。
导致每次切换都需要更改配置文件,时间久了次数多了,不仅配置有可能会出错,而且开发人员也会因琐碎的无重复工作而苦不堪言。因此,本文将简单介绍spring的profile机制,可以对不同的环境做不同的配置。
然后只需要为不同的环境打包不同的配置即可。
## 前提
该文档是以项目开发为导向,基于maven项目讲解。因此在使用前需要的软件:`Eclipse`,`tomcat 8`,`maven 3.3.3`,`mysql 5.6`等。
## 在maven项目中配置profile
### 添加配置文件`datasource-profile.xml`
该配置文件中仅包含**profile**机制的配置。
内容如下:
```xml
```
该方式是只加载每个环境不同的配置,比如上文提到的数据库,缓存等的配置信息。
展现下`/env/default.properties`配置文件中的内容:
```properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://172.20.19.200:3306/esn_palmyy_plugin?useUnicode=true&characterEncoding=UTF-8
jdbc.username=esn_palmyy
jdbc.password=esn_palmyy
```
以上只是简单的数据库连接的配置。其他配置文件中的内容与其相同,但该机制中需要将不同配置文件中修改为不同的参数值。
![各环境的配置文件](//raw.githubusercontent.com/George5814/blog-pic/master/image/spring/spring-profile-1.png)
在spring的主配置文件`applicationContext.xml`中使用``引入该配置,这样spring的profile的配置就简单的完成了。
**但是怎样在web项目启动时怎么指定使用的profile呢?请往下看。**
### 在Eclipse中启动web项目时应用`profile`机制
要在web项目中使用profile机制,需要在`web.xml`文件中添加几行配置。
```
spring.profiles.active
development
```
从属性名称上可以看出来该属性是指定web项目启动时激活使用的profile,value值即`datasource-profile.xml`中配置的profile属性值。
如果该参数不配置,那么不会加载任何profile下的内容,因此会导致使用到对应`*.properties`文件内占位符的其他配置会因为找不到替代值而报错。
虽然Eclipse中可以使用了,但如果使用mvn命令打包,每次更换环境都需要修改配置,好麻烦。能不能自动化一些呢?嗯可以,往下看。
### mvn命令打包时应用`profile`机制
既然mvn打包要指定`profile`,那就需要改`pom.xml`文件了。
在`pom.xml`中添加``内的所有内容:
```xml
org.apache.maven.plugins
maven-war-plugin
open-api
true
src/main/webapp
**/web.xml
src/main/webapp
src/main/webapp/WEB-INF/web.xml
testing
true
testing
org.apache.tomcat.maven
tomcat-maven-plugin
2.2
development
development
org.apache.tomcat.maven
tomcat-maven-plugin
2.2
produce
produce
org.apache.tomcat.maven
tomcat-maven-plugin
2.2
```
``内的打包插件是激活spring的profile,没有该配置即使配置了``内的内容也不会生效。
而``内的每个``对应上文配置的一个profile。
在项目根目录(pom.xml所在目录)下使用maven命令`mvn clean package`打包,当打包成功后,打开`target/project-name-version/WEB-INF/web.xml`文件,发现`spring.profiles.active`属性的值仍然是`development`。
怎么会没有改变呢?哦,原来是因为写的固定值,而不是占位符,没办法替换。
那将`web.xml`中的`spring.profiles.active`的值设置为占位符`${profiles.activation}`。
```xml
spring.profiles.active
${profiles.activation}
```
再次执行maven命令`mvn clean package`,执行成功后查看`web.xml`会发现`${profiles.activation}`位置已经被`testing`(pom.xml中设置默认使用的profile)替换了。
那我要想指定其他的profile呢?使用命令`mvn clean package -P profile-name`,`profile-name`是你指定的存在的profile名称,比如`produce`。执行成功后再次查看`${profiles.activation}`已经被指定的`produce`替换了。说明启动应用就会使用profile为`produce`的配置了。
哎,怎么在Eclipse中不能启动web项目了,难道还要将`web.xml`中的配置改回去吗,这样改来改去太麻烦了?别急,往下看。
### 解决mvn打包和Eclipse启动web项目报错问题
既然mvn打包没问题了,那就专注的看Eclipse中启动项目的问题,而我们又不想每次都改`web.xml`的`spring.profiles.active`,怎么办呢?嗯... 有了
在Eclipse中配置变量值,不就可以将占位符`${profiles.activation}`替换掉了嘛,太聪明了。操作如下:
项目右击 --> Run As --> Run configurations --> 左侧:选择要启动该项目的tomcat; 右侧:点击Environment,点击New,新增name和value,name就是上文中说的占位符内的变量`profiles.activation`,value填写你想指定的profile名称,如development。 -> 点OK -> 然后点Run。
这样就可以在tomcat中成功启动项目了,并且不影响maven中的打包。
**下次启动就不用配置了,直接部署项目启动tomcat就可以了。**