在开发的过程中,经常需要面对不同的运行环境(开发环境、测试环境、生产环境、内网环境、外网环境等等),在不同的环境中,相关的配置一般不一样,比如大数据源配置、日志文件配置、以及一些软件运行过程中的基本配置。每次在不同环境部署程序时,都需要修改相应的配置文件,使之完成环境的配置。这么做存在一个比较大的问题:每次修改配置非常麻烦,而且配置错误会产生不可预估的影响,比如,在发布大数据生产环境时用的大数据开发环境的配置还好,但如果在大数据开发环境下用大数据生产环境的数据,将会造成大数据生产数据的污染,导致大数据生产环境崩溃。
在我们平常的java开发中,会经常使用到很多配制文件(xxx.properties,xxx.xml),而当我们在本地开发(dev),测试环境测试(test),线上生产使用(product)时,需要不停的去修改这些配制文件,次数一多,相当麻烦。现在,利用maven的filter和profile功能,我们可实现在编译阶段简单的指定一个参数就能切换配制,提高效率,还不容易出错.
profile可以让我们定义一系列的配置信息,然后指定其激活条件。这样我们就可以定义多个profile,然后每个profile对应不同的激活条件和配置信息,从而达到不同环境使用不同配置信息的效果。
修改yedian-page-web的pom.xml
<properties> <port>9105</port> </properties> <build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <!-- 指定端口 --> <port>${port}</port> <!-- 请求路径 --> <path>/</path> </configuration> </plugin> </plugins> </build> |
运行tomcat7:run ,发现运行结果是一样的,因为port是变量,而变量值是定义为9105。这其实就是我们之前学习的maven的变量。
那我们现在思考一下,如果这个端口在开发时使用9105,如果在生产环境(或其他环境)为9205呢?如何解决值的动态切换呢?
这时我们修改pom.xml,增加profile定义
<profiles> <profile> <id>dev</id> <properties> <port>9105</port> </properties> </profile> <profile> <id>pro</id> <properties> <port>9205</port> </properties> </profile> </profiles> |
执行命令 tomcat7:run -Ppro 发现以9205端口启动
执行命令 tomcat7:run -Pdev 发现以9105端口启动
-P 后边跟的是profile的id
如果我们只执行命令tomcat7:run ,也是以9105启动,因为我们一开始定义的变量值就是9105,就是在不指定profileID时的默认值.
(1)我们在yedian-dao工程中src/main/resources下创建filter文
(2)filter文件夹下创建db_dev.properties ,用于配置开发环境用到的大数据库
env.jdbc.driver=com.mysql.jdbc.Driver env.jdbc.url=jdbc:mysql://localhost:3306/yediandb?characterEncoding=utf-8 env.jdbc.username=root env.jdbc.password=123456 |
(3)filter文件夹下创建db_pro.properties
env.jdbc.driver=com.mysql.jdbc.Driver env.jdbc.url=jdbc:mysql://localhost:3306/yediandb_pro?characterEncoding=utf-8 env.jdbc.username=root env.jdbc.password=123456 |
(4)修改properties下的db.properties
jdbc.driver=${env.jdbc.driver} jdbc.url=${env.jdbc.url} jdbc.username=${env.jdbc.username} jdbc.password=${env.jdbc.password} |
修改pom.xml
<properties> <env>dev</env> </properties> <profiles> <profile> <id>dev</id> <properties> <env>dev</env> </properties> </profile> <profile> <id>pro</id> <properties> <env>pro</env> </properties> </profile> </profiles> |
这里我们定义了2个profile,分别是大数据开发环境和大数据生产环境
修改pom.xml ,在build节点中添加如下配置
<filters> <filter>src/main/resources/filters/db_${env}.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> |
这里我们利用filter实现对资源文件(resouces)过滤
maven filter可利用指定的xxx.properties中对应的key=value对资源文件中的${key}进行替换,最终把你的资源文件中的username=${key}替换成username=value
在yedian-dao 工程 执行命令:package -P pro , 解压生成的jar包,观察db.properties配置文件内容,已经替换为生产环境的值。
在yedian-sellergoods-service工程 执行命令 pageage ,解压生成的war包里的yedian-dao的jar包,发现也是生成环境的值。
【1】连接大数据生产数据库
(1)在yedian-dao 工程执行命令:install-P pro
(2)在yedian-sellergoods-service:执行命令:tomcat7:run
(3)在yedian-shop-web : 执行命令:tomcat7:run
【2】连接大数据开发数据库
(1)在yedian-dao 工程执行命令:install-P dev (或 install )
(2)在yedian-sellergoods-service:执行命令:tomcat7:run
(3)在yedian-shop-web : 执行命令:tomcat7:run
(1)在yedian-common工程中properties下创建dubbox.properties
address=192.168.25.135:2181 |
(2)Spring目录下创建spring配置文件 applicationContext-dubbox.xml 配置如下:
<dubbo:registry protocol="zookeeper" address="${address}"/> |
(3)所有的服务工程与web工程都要依赖yedian-common . 并删除每个工程中关于注册中心地址的配置
(4)安装yedian-common到本地仓库,然后测试运行。
(1)在yedian-common工程中创建filters目录,目录下建立dubbox_dev.properties
env.address=192.168.25.135:2181 |
(2)建立dubbox_pro.properties
env.address=192.168.25.136:2181 |
(3)修改dubbox.properties
address=${env.address} |
(4)修改yedian-common的pom.xml
<properties> <env>dev</env> </properties> <profiles> <profile> <id>dev</id> <properties> <env>dev</env> </properties> </profile> <profile> <id>pro</id> <properties> <env>pro</env> </properties> </profile> </profiles> ............................. <build> <filters> <filter>src/main/resources/filters/dubbox_${env}.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build> |