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

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

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

原文发布于微信公众号 - Linyb极客之路(gh_c420b2cf6b47)

原文发表时间:2018-06-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏散尽浮华

sudo命令使用的几个场景

在linux系统下,普通用户无法直接执行root用户权限下的命令,如果想让普通用户执行只有root用户才能执行的操作命令。 下面罗列下经常使用sudo命令的几个...

2265
来自专栏北京马哥教育

巧用HTTP 响应头部提高 Web 安全性

在 Web 服务器做出响应时,为了提高安全性,在 HTTP 响应头中可以使用的各种响应头字段。 1、X-Frame-Options 该响应头中用于控制是否在浏览...

3437
来自专栏云计算教程系列

如何在Ubuntu 16.04上安装Apache Tomcat 8

Apache Tomcat是一个Web服务器和servlet容器,用于为Java应用程序提供服务。Tomcat是Apache Software Foundati...

1992
来自专栏北京马哥教育

Corosync + Pacemaker 搭建高可用MariaDB服务

实验描述 本实验的目的是为了通过手动配置corosync配置文件,实现MariaDB服务的高可用,集群心跳传递使用组播方式。 三个节点的主机名分别为:node5...

41210
来自专栏云计算教程系列

如何在Ubuntu 16.04上使用Apache和mod_wsgi为Django应用程序提供服务

Django是一个功能强大的Web框架,可以帮助您快速启动Python应用程序或网站。Django包含一个简化的开发服务器,用于在本地测试您的代码,但是对于任何...

1170
来自专栏Java帮帮-微信公众号-技术文章全总结

Dubbo入门学习--Dubbo注册及监控中心(3)

Dubbo入门学习--Dubbo注册及监控中心 Dubbo提供广播、Zookeeper、Redis和Simple四种注册中心类型。 Multicast注册中心 ...

3373
来自专栏云计算教程系列

如何使用Apache驱动Django

Django是一个功能强大的Web框架,可以帮助您快速启动Python应用程序或网站。Django包含一个简化的开发服务器,用于在本地测试您的代码。但是其也需要...

2865
来自专栏伦少的博客

centos7 hadoop 单机模式安装配置

转载请务必注明原创地址为:http://dongkelun.com/2018/03/23/hadoopConf/

52211
来自专栏逸鹏说道

ifconfig: command not found CentOS专版,其他的可以参考

ifconfig: command not found ? 查看path配置(echo相当于c中的printf,C#中的Console.WriteLine) e...

2798
来自专栏北京马哥教育

ubuntu 12.04下3分钟搭建apache+python的运行环境

关于搭建apache+python的运行环境,网上很多文章都是用cgi方式,配置非常繁琐,把很多不相干的东西都扯了进来,都没有说到要点上。对于很多新手朋友来说,...

3825

扫码关注云+社区

领取腾讯云代金券