使用 maven autoconfig 插件为不同环境生成不同的配置文件

2017-02-08 16:56:27   最后更新: 2017-02-08 16:56:27   访问数量:671




在上一篇日志中,我们介绍了怎样通过 maven 配置实现打包不同的资源配置目录:

通过 maven filtering 机制实现打包不同的资源配置目录

可以在代码中的同一级不同目录下存放相同配置文件名的不同配置,在打包的时候,通过 -P 参数方便的指定使用哪个目录下的配置文件,这一机制通常被称为 Maven Filtering 机制

由于实际的 jar 或 war 包中只包含指定的配置,因此不存在被攻击读取到非法配置的可能,在安全性、通用性方面非常不错,但是如果在打包后需要修改配置,就必须重新打包了,同时,在打包过程中,maven 并不会检查代码中使用到的配置是否存在,如果某个配置不存在,将会在运行时才能被检查出来

 

本篇日志中,我们将介绍 maven 的另一插件 -- AutoConfig,他与 maven filtering 机制最大的区别在于他是在 build 时使用的,因此可以在运行时期以前检查到配置的缺失或错误,同时他和 maven filtering 机制一样是不依赖于具体框架的,任何环境和框架均可使用这一插件

 

Maven Filtering 机制中,开发者负责填写配置,并为不同的环境生成包含有不同配置文件的 jar 或 war 包,而部署者却对各个包中的配置一无所知,开发者在一定程度上跨越到了部署者的职责中

而 autoconfig 机制则将开发者与部署者之间的职责区分开来,开发者定义配置文件模板,由部署者动态生成配置并部署,二者合理的区分了职责所在,并且,与 maven filtering 不同,部署者可以灵活的根据实际情况对生成的配置进行一定的修改,这在 maven filtering 机制中是无法实现的

 

pom.xml 配置

首先,为了启用 autoconfig 插件,我们需要在 maven 的 build 标签中加入如下配置:

<build> <plugins> <plugin> <groupId>com.meituan.service.mobile</groupId> <artifactId>autoconfig-maven-plugin</artifactId> <version>0.0.1</version> <executions> <execution> <phase>validate</phase> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <envBase>src/main/resources/META-INF/environments</envBase> <templateBase>src/main/resources/META-INF/templates</templateBase> <targetBase>src/main/resources</targetBase> <config>src/main/resources/META-INF/autoconfig.xml</config> </configuration> </plugin> </plugins> </build>

 

这里通过 configuration 标签中的子标签指定了诸如各环境的实际配置信息(envBase)、模板所在目录(templateBase)、生成的配置存放路径(targetBase)、autoconfig 配置路径(config)

 

当执行 mvn install 或 mvn package 命令时,增加 -Denv_config=dev 就会使用 envBase 中 dev 目录下的配置了

 

autoconfig 配置文件 -- autoconfig.xml

下面是一个 autoconfig.xml 的例子:

<?xml version="1.0" encoding="UTF-8"?> <autoconfig> <template-resources> <resource template="database.properties.vm" target="database.properties"/> <resource template="domain.properties.vm" target="domain.properties"/> <resource template="common.properties.vm" target="common.properties"/> <resource template="boot.ini.vm" target="jetty/boot.ini"/> <resource template="jmonitor.properties.vm" target="jmonitor.properties"/> <resource template="horae.properties.vm" target="horae.properties"/> </template-resources> </autoconfig>

 

他指定了模板与最终生成的配置文件的对应关系,举例来说,database.properties.vm 这个模板将读取 envBase 所配置的路径中当前环境目录下的所有配置文件,找到模板中所使用的配置项,然后在 targetBase 所配置的路径下生成对应的配置文件

 

配置模板

配置模板的填写非常简单,下面是配置模板的例子:

env=${env} clusterName=${clusterName}

 

 

不同环境下的配置文件

不同环境下的配置文件指定了模板中参数的实际取值:

env=dev clusterName=redis-qcs_dev

 

 

这样,模板结合对应的配置,就可以生成最终的配置文件了

 

webx/citrus https://github.com/webx/citrus

maven auto-config 多环境自动打包 http://blog.csdn.net/bjhecwq/article/details/41855973

AutoConfig工具使用指南 http://openwebx.org/docs/autoconfig.html#d0e18021

 






技术帖      龙潭书斋      java      spring      mvn      maven      plugin      autoconfig      properties     


京ICP备15018585号