也许有人说通过maven提供的profile机制,已经可以非常方便的切换不同环境的参数配置,但是这样会在配置中将数据库、redis等用户名密码暴露出去,如果项目要托管在git上就危险了。最近接触了阿里提供的maven插件autoconfig-maven-plugin,通过它可以实现不同环境使用不同配置进行打包,这样可以保证参数的安全。autoconfig是针对目标文件的配置工具,简单而实用的小工具。
文件结构
使用auto-config,需要按照一定的格式来写,配置文件结构如下图
/META-INF/autoconf目录用来存放AutoConfig的描述文件,以及可选的模板文件。
auto-config.xml是用来指导AutoConfig行为的关键描述文件。
准备工作
需要配置以下几个文件:描述文件auto-config.xml和若干配置文件的模板xxx.properties.vm
1、auto-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
<group name="test-core">
<property name="test_db_host" />
<property name="test_db_port" />
<property name="test_db_database" />
<property name="test_db_username" />
<property name="test_db_password" />
<property name="test_db_maxActive" />
<property name="test_db_initialSize" />
<property name="test_db_minIdle" />
<property name="test_thread_corePoolSize"/>
<property name="test_thread_maxPoolSize"/>
<property name="test_thread_queueCapacity"/>
</group>
<script>
<generate template="core.properties.vm" destfile="config/core.properties" charset="UTF-8"/>
<generate template="jdbc.properties.vm" destfile="config/jdbc.properties" charset="UTF-8"/>
</script>
</config>
2、模板core.properties.vm和jdbc.properties.vm
core.properties.vm
test.thread.corePoolSize = ${test_thread_corePoolSize}
test.thread.maxPoolSize = ${test_thread_maxPoolSize}
test.thread.queueCapacity = ${test_thread_queueCapacity}
jdbc.properties.vm
test.jdbc.driver = com.mysql.jdbc.Driver
test.jdbc.url = jdbc:mysql://${test_db_host}:${test_db_port}/${test_db_database}?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull
test.jdbc.username = ${test_db_username}
test.jdbc.password = ${test_db_password}
test.jdbc.maxActive = ${test_db_maxActive}
test.jdbc.initialSize = ${test_db_initialSize}
test.jdbc.minIdle = ${test_db_minIdle}
模板里的${test_thread_corePoolSize}一定要与auto-config.xml中property的name对应。
一般来说,不要在父pom.xml中设置AutoConfig,因为这个设置会作用在每个子模块上,导致不必要的AutoConfig执行,只在生成最终目标文件的子模块pom.xml中设置就可以了。对于一个web项目,在生成war包的子模块中设置AutoConfig plugin。
3、父pom中安装插件,指定版本autoconfig-plugin.version为1.2,profile指定引用变量配置文件
<pluginManagement>
<plugins>
<plugin>
<groupId>com.alibaba.citrus.tool</groupId>
<artifactId>autoconfig-maven-plugin</artifactId>
<version>${autoconfig-plugin.version}</version>
</plugin>
</plugins>
</pluginManagement>
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<properties>
<antx_properties>${project.basedir}/../deploy/antx/dev.properties</antx_properties>
</properties>
</profile>
</profiles>
4、必须的子模块pom.xml引入
<build>
<plugins>
<!-- autoconfig -->
<plugin>
<groupId>com.alibaba.citrus.tool</groupId>
<artifactId>autoconfig-maven-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>autoconfig</goal>
</goals>
</execution>
</executions>
<configuration>
<exploding>true</exploding>
<userProperties>${antx_properties}</userProperties>
</configuration>
</plugin>
</plugins>
</build>
以上。基于profile的antx_properties配置,我们可以随意指定参数的配置文件,注意点是auto-config.xml的属性名要与dev.properties对应。userProperties中指定的antx_properties是固定写法。
可以在Idea里保存配置mvn package -P dev,打包时就会自动生成core.properties和jdbc.properties文件,config文件夹要手动创建好。
linux环境如果要修改war包的配置,在war同一级模流执行以下命令:
mvn autoconf:autoconf -Dproperties=/home/admin/testDemo/test/antx.properties -Dpath=testDemo.war/
参考:http://openwebx.org/docs/autoconfig.html#d0e17303