如下的环境信息:
dev 开发环境
sit sit测试环境
uat uat测试环境
pre 预生产测试环境
prod 线上的生产环境
各环境的数据库配置完全不一样,还有一些配置,是依赖对应环境的内部系统,如在uat环境布署
的电子商务系统,就需要配置uat环境的订单处理系统,而不能调用dev环境的订单系统.
对于这种需求,有两种处理方式:
第一种,在proterties文件里使用${}变量,使用maven的filter进行赋值
http://maven.apache.org/shared/maven-filtering/
http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html
//test.properties jdbcname=${user_name} jdbcpasswd=${user_passwd}
这种变量在打包时,由maven从另一个依赖环境的配置文件里读出并赋值
比如
//在目录main/resources/sit/下 //env.properties user_name=user_sit user_passwd=passwd_sit ctx=somepath
//在目录main/resources/uat/下 //env.properties user_name=user_uat user_passwd=passwd_uat ctx=
......
配置五个对应的配置,然后在build配置里配置filter
<build> ... <filters> <filter>src/main/resources/${env}/env.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> ... </build>
然后添加maven profile配置,每个环境对应一个profile
<profiles> <!-- dev开发环境,默认激活 --> <profile> <id>dev</id> <properties> <env>dev</env> </properties> <activation> <activeByDefault>true</activeByDefault><!--默认启用的是dev环境配置 --> </activation> </profile> <!-- sit测试环境 --> <profile> <id>sit</id> <properties> <env>sit</env> </properties> </profile> <!-- uat测试环境 --> <profile> <id>uat</id> <properties> <env>uat</env> </properties> </profile> <!-- pre预生产测试环境 --> <profile> <id>pre</id> <properties> <env>pre</env> </properties> </profile> <!-- prod生产环境 --> <profile> <id>prod</id> <properties> <env>prod</env> </properties> </profile> </profiles>
//打包命令 打包uat环境的配置 mvn clean package -Puat
这时最终的配置文件test.properties里的属性会被替换为
//test.properties jdbcname=user_uat jdbcpasswd=passwd_uat
stackoverflow里web资源的替换
对于web资源,比如放到webapp目录下的js文件,不同的环境,需要用到不同的文件,可以使用
maven-war-plugin在打包时进行配置,
比如,我们在src/main/resources/目录下新建web目录,用于存放需要复制到webapp目录里的文件
比如我有个config.json文件,这个文件在dev sit uat prod 环境里都不一样
最终webapp目录结构如下:
├─META-INF ├─static │ ├─bootstrap │ │ └─2.3.2 │ │ ├─css │ │ │ bootstrap-responsive.min.css │ │ │ bootstrap.min.css │ │ │ │ │ ├─img │ │ │ glyphicons-halflings-white.png │ │ │ glyphicons-halflings.png │ │ │ │ │ └─js │ │ bootstrap.min.js │ │ │ ├─images │ │ favicon.ico │ │ │ ├─jquery │ │ config.json //该文件在各个目录里的配置都不一样 │ │ jquery-1.9.1.min.js │ │ │ ├─jquery-validation │ │ └─1.11.1 │ │ │ jquery.validate.min.js │ │ │ messages_bs_zh.js │ │ │ validate.css │ │ │ │ │ └─images │ │ unchecked.gif │ │ │ └─styles │ default.css │
config.json文件内容为
{ prefix:"old value", path:"/upload/path" }
创建src/main/resources/web/资源目录,目录结构如下:
└─static └─jquery config.json
config.json文件内容为
{ prefix:"${ctx}", path:"/upload/path" }
<!-- war打包插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.4</version> <configuration> <warName>${project.artifactId}</warName> <filters> <filter>src/main/resources/env/application-${env}.properties</filter> </filters> <webResources> <resource> <directory>src/main/resources/web</directory> <filtering>true</filtering> </resource> </webResources> </configuration> </plugin>
在执行 mvn package -Pprofile命令时,config.json里变量的值会被相应的替换和合适的值
第二种,使用maven-resources-plugin 的copy方式,将对应环境的配置对整个目录和文件进行覆盖。
http://maven.apache.org/plugins/maven-resources-plugin/examples/copy-resources.html
<profiles> <!-- dev开发环境,默认激活 --> <profile> <id>dev</id> <properties> <env>dev</env> </properties> <activation> <activeByDefault>true</activeByDefault><!--默认启用的是dev环境配置 --> </activation> </profile> <!-- sit测试环境 --> <profile> <id>sit</id> <properties> <env>sit</env> </properties> </profile> <!-- uat测试环境 --> <profile> <id>uat</id> <properties> <env>uat</env> </properties> </profile> <!-- pre预生产测试环境 --> <profile> <id>pre</id> <properties> <env>pre</env> </properties> </profile> <!-- prod生产环境 --> <profile> <id>prod</id> <properties> <env>prod</env> </properties> </profile> </profiles>
<build> .... <plugin> <artifactId>maven-resources-plugin</artifactId> <version>2.7</version> <executions> <execution> <id>copy-resources</id> <!-- here the phase you need --> <phase>process-resources</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${basedir}/target/classes/</outputDirectory> <resources> <resource> <directory>src/main/resources/${env}/</directory> <filtering>true</filtering> </resource> </resources> </configuration> </execution> </executions> </plugin> .... </build>
//打包命令 打包uat环境的配置 mvn clean package -Puat