您的位置:首页 > 其它

maven分环境打包方案

2016-10-25 19:34 323 查看

前言

目前大多数互联网公司内部将开发环境分为 日常、预发布与线上三套环境,不同环境之间的服务配置项需要做到隔离。例如,数据库连接配置,Zookeeper地址、其他系统url 等等。

本文着重介绍的就是如何通过 Maven 来管理不同环境的配置文件,通过profile来实现分环境打包。

正文

以web开发为例,大部分web开发项目整体结构如下图:



目录描述
resources存放公共资源文件
resources.pre存放预发布环境配置文件
resources.prod存放线上生产环境配置文件
本文以数据库为例进行讲解,spring-dao.xml如下:

<bean id="parentDataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close"  abstract="true" init-method="init" >
<!-- 初始化连接大小 -->
<property name="initialSize" value="2" />
<!-- 连接池最大使用连接数量 -->
<property name="maxActive" value="10" />
<!-- 连接池最小空闲 -->
<property name="minIdle" value="5" />
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="30000" />
<!-- <property name="poolPreparedStatements" value="true" /> -->
<!-- <property name="maxPoolPreparedStatementPerConnectionSize" value="33" /> -->
<property name="validationQuery" value="SELECT 1" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<property name="testWhileIdle" value="true" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="25200000" />
<!-- 打开removeAbandoned功能 -->
<property name="removeAbandoned" value="true" />
<!-- 1800秒,也就是30分钟 -->
<property name="removeAbandonedTimeout" value="1800" />
<!-- 关闭abanded连接时输出错误日志 -->
<property name="logAbandoned" value="true" />
<!-- 监控数据库 -->
<!-- <property name="filters" value="stat" /> -->
<property name="filters" value="mergeStat" />

</bean>

<!-- 配置数据源-->
<bean id="masterDataSource" parent="parentDataSource">
<property name="url" value="#{jdbc['master.jdbc.url']}" />
<property name="username" value="#{jdbc['master.jdbc.username']}" />
<property name="password" value="#{jdbc['master.jdbc.password']}" />
<property name="driverClassName" value="#{jdbc['master.jdbc.driver']}" />
<property name="maxActive" value="15" />
</bean>

<bean id="slave1DataSource" parent="parentDataSource">
<property name="url" value="#{jdbc['slave1.jdbc.url']}" />
<property name="username" value="#{jdbc['slave1.jdbc.username']}" />
<property name="password" value="#{jdbc['slave1.jdbc.password']}" />
<property name="driverClassName" value="#{jdbc['slave1.jdbc.driver']}" />
</bean>


applicationContext.xml如下:

<context:annotation-config/>
<context:component-scan base-package="com.bytebeats" />

<!-- 引入配置文件 -->
<util:properties id="jdbc" location="classpath:jdbc.properties"/>

<import resource="spring-mvc.xml"/>
<import resource="spring-dao.xml"/>


因为需要部署到3套环境中去,我们需要有3份数据库配置文件,测试环境配置 resources/jdbc.properties 如下:

master.jdbc.driver=com.mysql.jdbc.Driver
master.jdbc.url=jdbc:mysql://192.168.1.1:3306/crm?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
master.jdbc.username=root
master.jdbc.password=root

slave1.jdbc.driver=com.mysql.jdbc.Driver
slave1.jdbc.url=jdbc:mysql://192.168.1.100:3306/crm?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
slave1.jdbc.username=root
slave1.jdbc.password=root


预发布环境 resources.pre/jdbc.properties 如下:

master.jdbc.driver=com.mysql.jdbc.Driver
master.jdbc.url=jdbc:mysql://10.130.1.1:3306/crm?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
master.jdbc.username=root
master.jdbc.password=root

slave1.jdbc.driver=com.mysql.jdbc.Driver
slave1.jdbc.url=jdbc:mysql://10.130.1.100:3306/crm?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
slave1.jdbc.username=root
slave1.jdbc.password=root


线上环境 resources.prod/jdbc.properties 如下:

master.jdbc.driver=com.mysql.jdbc.Driver
master.jdbc.url=jdbc:mysql://211.85.1.1:3306/crm?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
master.jdbc.username=root
master.jdbc.password=root

slave1.jdbc.driver=com.mysql.jdbc.Driver
slave1.jdbc.url=jdbc:mysql://211.85.1.100:3306/crm?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
slave1.jdbc.username=root
slave1.jdbc.password=root


最关键的地方来了,针对多个不同的环境定义多个profile,以本文为例分别定义test、pre、prod,pom.xml配置如下:

<profiles>
<!--日常开发环境-->
<profile>
<id>test</id>
</profile>

<!--预发布环境-->
<profile>
<id>pre</id>
<properties>
<package.environment>.pre</package.environment>
</properties>
</profile>

<!--线上环境-->
<profile>
<id>prod</id>
<properties>
<package.environment>.prod</package.environment>
</properties>
</profile>
</profiles>


打包

以IDEA为例,如下图:



例如,当需要打生产环境war包时,只需选中 prod 这个profile 然后点击 package即可,最后在



当然也可以使用maven窗口命令行来执行package:

mvn package –P prod


上述样例代码均已上传至Github,点此下载

参考资料

Maven实战(九)——打包的技巧:http://www.infoq.com/cn/news/2011/06/xxb-maven-9-package
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: