代码里的resource信息有不少,代码里写死某一个环境的配置的话,有如下若干问题。spring
1. dev,不一样的beta上,使用的resource信息不一样。sql
2. 代码没有发布到对应的环境上,须要去机器上须要手动修改。不锁住配置文件,则每次发布都须要手动修改;若锁住配置文件,则代码更新了配置文件,则机器上仍是老的配置文件。把测试的环境写到代码里,容易引发配置不稳定,上线前忘了改过来可能形成问题。数据库
3. 测试中有时日志中没有打出来是使用的是哪一个环境配置,发现环境不对时,查起来费时又费劲。dom
4. 环境交付其余团队使用时,出问题还须要支出人力配合定位问题。maven
为了解决以上问题,咱们能够作如下的事情。测试
1、profileui
当resource配置信息内容根据环境种类的不一样而不一样时,如dev和beta使用不一样的sql数据库链接配置等,使用profile来针对每一个环境配置一套resource。pmo中加入:日志
<profiles> <!-- 打包开发环境 --> <profile> <id>dev</id> <activation> <property> <name>hello.dev</name> <value>dev</value> </property> </activation> <build> <resources> <resource> <directory>${profiles.dir}/dev</directory> </resource> </resources> </build> </profile> <!-- 打包beta环境 --> <profile> <id>hello.beta</id> <activation> <property> <name>hello.beta</name> <value>beta</value> </property> </activation> <build> <resources> <resource> <directory>${profiles.dir}/beta</directory> </resource> </resources> </build> </profile> </profiles>
指定dev和beta分别使用的resource目录。咱们在profiles.dir里准备好对应的resource配置便可。发布时,使用maven命令激活相应的环境便可:mvn -P beta 即便用了beta的profile。xml
2、filterblog
有时,同一种环境,只是域名不一样,可使用filter来进行变量替换。如,环境A1上,域名应是xxxA1.beta.com; 环境A2上,域名应是xxxA2.beta.com。pmo上配置:
<profile> <id>beta</id> <activation> <property> <name>hello.beta</name> <value>beta</value> </property> </activation> <build> <filters> <filter>src/main/filters/beta.properties</filter> </filters> <resources> <resource> <directory>${profiles.dir}/beta</directory> <filtering>true</filtering> <includes> <include>**/*.properties</include> <include>**/*.config</include> <include>**/*.xml</include> </includes> </resource> </resources> </build> </profile>
配置里说,${profiles.dir}/beta里符合条件的文件,须要被filter里配置的文件里的参数进行替换。filter配置src/main/filters/beta.properties里的文件怎么写呢?
all.use.A.domain=xxxA1.beta.com all.use.B.domain=xxxB1.beta.com
看到filter文件里,配置了A服务对应的域名是xxxA1.beta.com。就是说,resource文件里,遇到${all.use.A.domain}这个变量时,即替换为xxxA1.beta.com。
以上是默认的配置,在编译的时候,使用命令:mvn -Pbeta clean package -Dall.use.A.domain=xxxA2.beta.com,则在编译的时候,会将xxxA2.beta.com这个内容替换到resource里${all.use.A.domain}的变量处。
注意与profile下配置文件里的变量的区别。在filter文件里的变量,在编译时,会替换掉原文件中的值。而在profile配置文件中定义的变量,不会替换代码里的变量占用号,发布机器上,还是变量符号。
好比,resources文件spring-dubbo-consumer.xml里,配置文件内容为:
<dubbo:registry id="ordercenter_core" protocol="zookeeper" address="${dubbo.zk}" group="${core_dubbo_group}"></dubbo:registry>
其中,${dubbo.zk}这个变量内容定义在profiles下的文件中,内容为dubbo.zk=l-zk.beta.com:8888。代码发布到测试上后,查看spring-dubbo-consumer.xml,内容不变。变量替换是在服务执行时完成的。