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

时间:2021-08-03 21:49:00

背景介绍,问题所在

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

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

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

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

项目为例,如何解决

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

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

目录结构如下:

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

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

本地环境 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

开发环境 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

测试环境 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

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}

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>

redisHost.properties

host=${host}
port=${port}

③ 修改项目的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>
</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

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>

redisHost.properties

host=192.168.22.246
port=6379

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


另外:如果使用Jenkins集成

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

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



小结

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

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