1.autoconfig介绍
在一个Java应用中(例如web应用或包含main方法的其他应用)通常有很多参数需要配置,例如数据库ip和端口、用户名等,这些参数有的在二方库jar包中,有的在应用自身的war包或jar包中。这些参数的取值通常随着运行环境的变化而变化,例如在开发环境、测试环境、部署环境中有不同的一组配置。同一个二方库中的参数,在依赖它的A应用和B应用中也可能需要有不同的参数值。这里不讨论应用部署后的动态参数配置问题。
autoconfig是阿里的宝宝同学开发的自动化参数配置工具,举个具体的例子,有个二方库C.jar,有A和B两个web应用依赖(使用)该二方库,该二方库在A、B两个应用中的参数配置是不同的,同时这两个应用自身也有一些参数需要配置,例如web.xml中的一些参数。此外对A应用和C.jar,在开发、测试和部署阶段,参数配置都有可能不同。autoconfig对以上场景都有很好的支持,能自动将参数配置自动注入到war包和jar包中,具体介绍见AutoConfig工具使用指南。下面只讲在多个web应用下一些需要注意的问题。
2.多应用下的使用
如果采用maven构建,autoconfig在mvn package阶段处理配置项。多个不同的web应用缺省使用一个属性文件(缺省为home目录下的antx.properties)。为了减少相互间的影响,每个web应用最好采用独立的属性文件,各自维护,对公有的部分可独立出来,在每个应用的属性文件中包含进来即可。另外开发环境、测试环境、生产环境的参数配置通常是不一样的,所以每个web应用需要有3个autoconfig属性文件,分别为antx.properties.dev(用于开发环境)、antx.properties.test(用于测试环境)、antx.properties.deploy(用于生产境)。
这三个属性文件存放在web应用的src/main/webapp/META-INF/autoconf目录下,autoconfig的auto-config.xml文件也在该目录,如下图。需要进行参数配置的二方库在相关的目录中也有auto-config.xml文件,但无属性文件。
pom文件修改:
使用autoconfig需要修改web应用的pom文件,二方库pom不需要修改。如下:
a)在<properties>中加入如下内容:
<!-- autoconfig属性文件,缺省为开发环境autoconfig属性文件名-->
<autoconfig.properties>antx.properties.dev</autoconfig.properties>
b)加入如下内容,分别定义三个profile:dev(开发环境)、test(测试环境)、deploy(部署环境)对应的autoconfig属性文件名。在eclipse maven build或命令行运行mvn命令时要指定相应的profile,这样就实现了开发、测试、部署阶段使用不同的属性文件。mvn命令不指定profile则使用开发环境的autoconfig属性文件。
<profile>
<id>dev</id>
<properties>
<autoconfig.properties>antx.properties.dev</autoconfig.properties>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<autoconfig.properties>antx.properties.test</autoconfig.properties>
</properties>
</profile>
<profile>
<id>deploy</id>
<properties>
<autoconfig.properties>antx.properties.deploy</autoconfig.properties>
</properties>
</profile>
c)在<plugins>中加入autoconfig插件,如下:
<plugin>
<groupId>com.alibaba.citrus.tool</groupId>
<artifactId>autoconfig-maven-plugin</artifactId>
<version>1.2</version>
<configuration> <userProperties>${basedir}/src/main/webapp/META-INF/autoconf/${autoconfig.properties}</userProperties>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>autoconfig</goal>
</goals>
</execution>
</executions>
</plugin>
在上面的配置中,userProperties属性指定autoconfig属性文件全路径。basedir是maven内置属性,表示pom文件所在目录,每个应用的pom文件肯定是位于不同的目录,这样就实现了每个应用的属性文件分开。
另外:AutoConfig是针对目标文件(war、jar包)的配置工具,对web应用就是针对war包中的文件和war包中的jar包注入参数配置。在eclipse中通过maven在jetty中运行时,goal目标要是jetty:run-war,不能为jetty:run。