Maven利用Profile构建不同环境的部署包

背景介绍,问题所在

一个项目里总会有很多配置文件,有配置文件是好事,说明项目灵活,但是有的配置文件需要区分不同的环境,即不同的环境,配置文件里的值会有区别,我们需要根据环境的变化来修改配置文件中的值,这样就很不爽了。

我们就遇到了这种情况,公司现在就有四套环境,本机环境(开发人员本机环境)、开发环境(开发阶段,小组内自测用)、测试环境(测试团队用)、生产环境(项目正式上线后的环境)。

在这些不同的环境下有些配置文件的值就会不一样。比如数据库连接配置、远程调用配置、shiro-cas配置、日志路径配置等等这些都是很常见的。所以在构建之前,要根据环境的不同来手动修改配置文件相应的值,然后提交svn,在通过Jenkins构建部署到不同的环境下。这大大增加了开发者的工作量,而且稍不注意就会出错,搞的大家怨声载道。

经过研究发现Maven中的profile可以帮助咱们解决这些问题。 

项目为例,如何解决

下面以我们的项目为例,来看看Maven是如何解决这个问题的

① 为每个环境添加配置文件

目录结构如下:

这里写图片描述

将那些会根据环境不同而变化的配置值填写到对应的配置文件中,比如下面的举例。

本地环境 local.properties:

#shiro-cas配置
loginUrl=http://192.168.22.246:8888/cas/login?service=http://localhost:8091/itoo-basic-editTrainingprogram-web/shiro-cas
casServerUrlPrefix=http://192.168.22.246:8888/cas
casService=http://localhost:8091/itoo-basic-editTrainingprogram-web/shiro-cas
#日志路径
logPath=d:/
#Redis IP 端口
redisIp=192.168.22.246
redisPort=6379
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

开发环境 dev.properties:

#shiro-cas配置
loginUrl=http://192.168.22.246:8888/cas/login?service=http://192.168.22.247:8091/itoo-basic-editTrainingprogram-web/shiro-cas
casServerUrlPrefix=http://192.168.22.246:8888/cas
casService=http://192.168.22.247:8091/itoo-basic-editTrainingprogram-web/shiro-cas
#日志路径
logPath=/usr/itoo-basic-log/
#Redis IP 端口
redisIp=192.168.22.246
redisPort=6379
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

测试环境 test.properties:

#shiro-cas配置
loginUrl=http://192.168.22.210:8888/cas/login?service=http://192.168.22.211:8091/itoo-basic-edittrainingprogram-web/shiro-cas
casServerUrlPrefix=http://192.168.22.210:8888/cas
casService=http://192.168.22.211:8091/itoo-basic-edittrainingprogram-web/shiro-cas
#日志路径
logPath=/usr/itoo-basic-log/
#Redis IP 端口
redisIp=192.168.22.210

redisPort=6379
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

PS:日志路径问题,本机开发为windows环境,路径为D:\xxx;开发环境,测试环境等都是Linux环境,路径为/usr/xxx/xx。格式不一样要做区分。

② 修改项目原有的配置文件

比如shiro-cas.properties、log4j.xml、redisHost.properties,将原来写的死值,也就是每次需要修改的地方,替换成变量:${xxx}

shiro-cas.properties

loginUrl=${loginUrl}
casServerUrlPrefix=${casServerUrlPrefix}
casService=${casService}
  • 1
  • 2
  • 3

log4j.xml

    <appender name="DEFAULT-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${logPath}editTrainingprogram-default.log" />
        <param name="DatePattern" value="'.'yyyy-MM-dd" />
        <param name="Append" value="false" />
        <param name="Encoding" value="UTF-8" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%X{usreId}] %-5p %c{2} - %m%n" />
        </layout>
    </appender>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

redisHost.properties

host=${host}
port=${port}
  • 1
  • 2

③ 修改项目的pom.xml 文件

添加下面文件(直接复制即可,不区分系统和模块)

第一种写法:

        <profiles>
                <profile>
                        <!-- 本地环境 -->
                        <id>local</id>
                        <build>
                                <filters>
                                        <filter>src/main/resources/filters/local.properties</filter>
                                </filters>
                        </build>
                        <!-- 默认激活本环境 -->
                        <activation>
                                <activeByDefault>true</activeByDefault>
                        </activation>
                </profile>
                <profile>
                        <!-- 开发环境 -->
                        <id>dev</id>
                        <build>
                                <filters>
                                        <filter>src/main/resources/filters/dev.properties</filter>
                                </filters>
                        </build>
                </profile>
                <profile>
                        <!-- 生产环境 -->
                        <id>prod</id>
                        <build>
                                <filters>
                                        <filter>src/main/resources/filters/prod.properties</filter>
                                </filters>
                        </build>
                </profile>
                <profile>
                        <!-- 测试环境 -->
        <id>test</id>
                        <build>
                                <filters>
                                        <filter>src/main/resources/filters/test.properties</filter>
                                </filters>
                        </build>
                </profile>
        </profiles>

        <build>
                <!-- 指定需要编译的目录 -->
                <resources>
                        <resource>
                                <directory>src/main/resources</directory>
                                <!--可以在此配置过滤文件  -->
                                <includes>
                                        <include>**/*.xsd</include>
                                        <include>**/*.properties</include>
                                        <include>**/*.xml</include>
                                </includes>
                                <!--开启filtering功能  -->
                                <filtering>true</filtering>
                        </resource>
      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

第二种写法:

<profiles>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <env>dev</env>
            </properties>
        </profile>
        <profile>
            <id>pro</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <env>pro</env>
            </properties>
        </profile>
        <profile>
            <id>test</id>
            <activation>
            	<activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <env>test</env>
            </properties>
        </profile>
    </profiles>
<build>
    <filters>
         <filter>src/main/resources/env/${env}.properties</filter>
      </filters>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
</build>




上面的配置:

1. 通过不同的profile指定不同环境的id和对应的配置文件。

2. 通过resources 指定要编译的目录,过滤哪些配置文件,项目中实际用到的配置文件。意思是对src/main/resources目录下的配置文件进行占位符替换。

④ 通过maven编译打包,测试效果

在对应的pom.xml文件,右键Run as –> Maven Build->输入install –Pxxx,xxx指定是哪个环境id,也就是咱们在pom.xml中配置的profile的Id。

假如不指定 -P 参数的话,则会使用 activeByDefault=true 的一项(即 local)。

比如开发环境执行:clean install –Pdev 
打包后配置文件:

shiro-cas.properties

loginUrl=http://192.168.22.246:8888/cas/login?service=http://192.168.22.247:8091/itoo-basic-editTrainingprogram-web/shiro-cas
casServerUrlPrefix=http://192.168.22.246:8888/cas
casService=http://192.168.22.247:8091/itoo-basic-editTrainingprogram-web/shiro-cas
  • 1
  • 2
  • 3
  • 4

log4j.xml

    <appender name="DEFAULT-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="/usr/itoo-basic-log/editTrainingprogram-default.log" />
        <param name="DatePattern" value="'.'yyyy-MM-dd" />
        <param name="Append" value="false" />
        <param name="Encoding" value="UTF-8" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%X{usreId}] %-5p %c{2} - %m%n" />
        </layout>
    </appender>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

redisHost.properties

host=192.168.22.246
port=6379
  • 1
  • 2

比如生产环境:clean install –Pprod 
测试环境执行:clean install –Ptest


另外:如果使用Jenkins集成

因为咱们的每一套环境都由相应的Jenkins来完成持续集成的工作(包含maven Build工作),所以需要修改每个模块的Jenkins配置:如果是开发环境就在deploy后添加-Pdev,生产环境就添加-Pprod,测试就添加-Ptest。

这里写图片描述



小结

简单来说,Maven多环境打包原理就是,事先建立好各个环境的配置文件,写好对应的值,比如dev.properties、test.properties、prod.properties,然后在项目打包发布的时候,用命令指定使用一个环境的配置文件,用其实际内容来替换项目配置文件中的占位符。

经过这样配置完后,咱们就再也不用受各种环境IP-端口号的煎熬了,是个一劳永逸的办法。

阅读更多
想对作者说点什么? 我来说一句

使用maven Profile实现多环境构建

2017年09月08日 13KB 下载

没有更多推荐了,返回首页

不良信息举报

Maven利用Profile构建不同环境的部署包

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭