Maven项目多环境配置

常见的情况是一个项目可能分为多个环境比如测试环境、生产环境,各个环境的MySQL地址等等其他配置不一样,而且好的部署一般都使用Jenkins自动化部署,那么怎么能够从同一个GIT拉取不同的配置文件进行Build发布呢?

进入主题:

Maven构建:mvn clean assembly:assembly -D portableConfig=”src/main/portable/localTest.xml” -U

这里能够看到构建参数有一个DportableConfig 这个文件就指定了需要替换参数值的文件

例子:applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx.xsd "
    default-autowire="byName">

    <!-- 阿里 druid数据库连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
        destroy-method="close">
        <!-- 数据库基本信息配置 -->
        <property name="url" value="jdbc:mysql://localhost:3306/XXX?useUnicode=true&amp;characterEncoding=UTF-8" 
            />
        <property name="username" value="root" />
        <property name="password" value="root" /> 
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="filters" value="stat" />
        <!-- 最大并发连接数 -->
        <property name="maxActive" value="20" />
        <!-- 初始化连接数量 -->
        <property name="initialSize" value="1" />
        <!-- 配置获取连接等待超时的时间 -->
        <property name="maxWait" value="60000" />
        <!-- 最小空闲连接数 -->
        <property name="minIdle" value="10" />
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000" />
        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000" />
        <property name="validationQuery" value="SELECT 'x'" />
        <property name="testWhileIdle" value="true" />
        <property name="testOnBorrow" value="false" />
        <property name="testOnReturn" value="false" />
        <property name="maxOpenPreparedStatements" value="20" />
        <!-- 打开removeAbandoned功能 -->
        <property name="removeAbandoned" value="true" />
        <!-- 3600秒,也就是60分钟 -->
        <property name="removeAbandonedTimeout" value="3600" />
        <!-- 关闭abanded连接时输出错误日志 -->
        <property name="logAbandoned" value="true" />
        <property name="poolPreparedStatements" value="false" />
    </bean>
    .........
</beans>

这是MySQL的配置信息,那么我们的portableFile是:src/main/portable/localTest.xml

<?xml version="1.0" encoding="UTF-8"?>

<portable-config>
    <!-- 替换xml文件 start -->
    <config-file path="WEB-INF/classes/spring/applicationContext.xml">
        <replace xpath="//bean[@id='dataSource']/property[@name='url']/@value">jdbc:mysql://192.168.XX.XX:3317/XXXX?useUnicode=true&amp;amp;characterEncoding=UTF-8</replace>
        <replace xpath="//property[@name='username']/@value">XXX</replace>
        <replace xpath="//property[@name='password']/@value">XXXXXXX</replace>
    </config-file>
</portable-config>

这里,在localTest.xml 中我们通过指定需要替换的文件 - 需要替换的Bean - 需要替换的属性这种形式替换掉了原本文件的对应的值,那么我们在发布时使用maven构建就可以自动化替换并且发布了。

相应的,如果有多个环境只需要配置多个portableFile,并且在不同环境的Jenkins里面替换对应的命令就可以了。

另外:参数index的形式:

<bean id="StockQuoteBuffer" class="com.ykk.StrategyFarm.CacheManager.Quote.StockQuoteBuffer">
        <constructor-arg index="0">
            <value>E:/</value>
        </constructor-arg>    
        <constructor-arg index="1">
            <value>http://119.254.153.5:2052/PlayBackService/stock/dkline.do</value>
        </constructor-arg>    
        <constructor-arg type="java.lang.Integer" index="2" >
            <value>3</value>
        </constructor-arg>    
</bean>


 <config-file path="applicationContext.xml">  
        <replace xpath="//bean[@id='StockQuoteBuffer']/constructor-arg[@index='0']/value">/opt/jen/jar</replace>
    <replace xpath="//bean[@id='StockQuoteBuffer']/constructor-arg[@index='1']/value">http://192.168.77.166:8082/PlayBackService/stock/dkline.do</replace>     
 </config-file>

另外,properties文件修改

<!-- 替换properties文件 start -->
    <config-file path="WEB-INF/classes/upload_file_config.properties">
        <replace key="uploadDirPath">/data/analysis_data/</replace>
        <replace key="analysisResultDirPath">/data/analysisPy/result/</replace>
    </config-file>
<!-- 替换properties文件 stop -->

替换set:

<set>
    <value>127.0.0.1</value>
    <value>127.0.0.1</value>
    <value>127.0.0.1</value>
    <value>127.0.0.1</value>
</set>

<replace xpath="//property[@name='trustIP']/set/value[0]">192.168.77.151 </replace>

比较遗憾的是还不知道怎么添加新行,暂时只能替换现有行。

另一种方法:
mvn package -P pro-c
在项目POM文件中添加:

<profiles>
        <profile>
            <id>devlop</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <build>
                <filters>
                    <filter>
                        src/main/properties/develop.properties
                    </filter>
                </filters>
            </build>
        </profile>
        <profile>
            <id>test</id>
            <build>
                <filters>
                    <filter>
                        src/main/properties/test.properties
                    </filter>
                </filters>
            </build>
        </profile>
    </profiles>

.properties文件中内容:

#log out level
log.level = info

jdbc.username=XXX

配置文件格式:

<bean id="commonDataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="username" value="${jdbc.mycat.username}" />
        <property name="password" value="${jdbc.mycat.password}" />
        <!-- mysql驱动类 -->
..........

可以替换xml文件,properties文件,json文件,不知道还支持什么别的格式。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×