autoConfig插件

自动化的配置工具autoconfig。autoconfig使用一套配置模板,为不同的环境生成相应的具体配置。

它的核心思想是把一些可变的配置定义为一个模板,在autoconfig运行的时候从这些模板中生成具体的配置文件。

autoconfig支持两种运行方式,第一种是作为普通的java应用程序从命令行来调用,另一种是作为maven的插件来运行。

主要讲述内容:

自动配置的主配置文件autoconfig.xml文件中
在 group标签中配置property标签,其中property标签上配置参数名称,decription等,
在对应script标签中配置的对应模板文件,模板文件的路径,和对应的编码;
其中模板文件中的${xxx_xx_xxx}变量,将会被autoconfig文件中配置的对应的name为xxx.xx.xxx(属性名中的点在autoconfig执行的时候会被替换成下划线)的value值所代替;

怎么给property的这个配置项赋值呢?
autoconfig提供了两种方式来给配置变量赋值
第一从java属性文件中读取(antx.properties文件)
第二是交互式地编辑。autoconfig首先读取当前工作目录的antx.properties文件(与pom文件同级),
如果没有则读取${user.home}/antx.properties(C:\Users\Administrator\antx.properties)文件,如果这个文件也不存在,autoconfig就会启动交互式编辑器请求用户输入配置变量的值,
如果配置变量的值是不完整的autoconfig则会立即停止配置并抛出一个异常。
如果java属性文件的位置不在autoconfig默认的位置可以通过参数autoconfig.userProperties进行配置。

如现在的项目可通过 mvn jetty:run-war -Dautoconfig.userProperties=../antx-jfw.properties 语句启动 ,autoconfig.userProperties=../antx-jfw.properties自定义了自动配置属性文件;

==================================================================================================

对于java程序员来说各种各样的配置文件是司空见惯的,比如spring的bean配置,struts的action配置等等。有些配置会随着运行环境的变化而各不相同,最典型的就是jdbc驱动的配置,在开发环境可能链接到开发本地的数据库,测试环境则有一套测试专用的数据库环境,线上的生产环境也会有一套数据库,如果一个应用要部署到多个idc中,那这些配置又有可能各不相同。解决这个问题,可能有些团队使用同一份配置文件,在部署到不同的环境之前人肉的修改一下配置,还有些团队会为每一个环境维护一份配置文件。这些做法都比较容易出错,而且随着环境的增多成本会线性地增长。 

本文通过一个示例简单介绍一个自动化的配置工具autoconfig。autoconfig使用一套配置模板,为不同的环境生成相应的具体配置。它的核心思想是把一些可变的配置定义为一个模板,在autoconfig运行的时候从这些模板中生成具体的配置文件。autoconfig支持两种运行方式,第一种是作为普通的java应用程序从命令行来调用,另一种是作为maven的插件来运行。本文通过一个maven项目展示一下如何在maven中使用autoconfig。 

autoconfig是一个淘宝开源的web框架webx的一个工具包,svn地址为 http://code.taobao.org/svn/webx/citrus-tool/trunk/,使用之前先checkout源代码本地安装一下,当然感兴趣的同学也可已研究一下它的源代码。安装非常简单,在checkout的源代码的根目录下运行 mvn clean install -Dmaven.test.skip。由于autoconfig使用maven build,安装之前必须先安装maven,不知到如何安装maven的同学可以google一下。 

首先通过maven新建一个普通的java项目,运行下面这个命令,敲几个回车就能通过maven创建一个普通的java应用程序项目。 

mvn archetype:generate -DgroupId=net.kiminotes -DartifactId=autoconfig -Dpackage=net.kiminotes 

先删除maven自动创建的一些java源代码 find . -name *.java -exec rm \{} \; (这是linux下的一个工具,使用windows的同学可以通过资源管理器来删除)。创建一个简单的java类 Main,类中只有一个main方法,这个方法读取一个配置文件,并在控制台输出整个配置文件,代码如下。 


Java代码  收藏代码
  1. package net.kiminotes;   
  2.    
  3. import java.util.Properties;   
  4. import java.io.InputStream;   
  5.    
  6.    
  7. public class Main {   
  8.     public static void main( String[] args ) throws Exception {   
  9.         InputStream is = Main.class.getClassLoader().getResourceAsStream( "config.properties" );   
  10.         if ( is == null ) {   
  11.             System.err.println( "Can not load config resource config.properties in classpath" );   
  12.         } else {   
  13.             Properties prop = new Properties();   
  14.             prop.load( is );   
  15.             is.close();   
  16.             for( String key : prop.stringPropertyNames() ) {   
  17.                 String value = prop.getProperty( key );   
  18.                 if ( value != null ) {   
  19.                     System.out.printf( "%s = %s %n", key, value );   
  20.                 }   
  21.             }   
  22.         }   
  23.     }   
  24. }   


从代码中可以看到实现的功能非常简单:从classpath中读取配置文件config.properties,然后输出到控制台。 

接下来创建antoconfig的描述文件auto-config.xml以及配置文件config.properties的模板config.properties.vm。 

config.properties的模板内容如下,它只有一行配置。 


Java代码  收藏代码
  1.    
  2. key = ${net_kiminotes_value}   


antoconfig的描述文件auto-config.xml内容如下。 

Xml代码  收藏代码
  1. <config>   
  2.     <group>   
  3.         <property name="net.kiminotes.value" />   
  4.     </group>   
  5.    
  6.     <script>   
  7.         <generate template="config.properties.vm" destfile="config.properties" charset="utf-8" />   
  8.     </script>   
  9. </config>   


property元素定义了一个需要autoconfig配置的属性 net.kiminotes.value。group元素把不同类库的property进行分组,这里仅配置了一个group。generate定义了一个配置文件生成策略,template属性定义了配置文件的的模板,destfile定义了生成后配置文件的存放位置。 

注: 有人或许会感觉迷惑,在模板文件config.properties.vm中,需要被替换的明明是net_kiminotes_value,为什么在auto-config.xml文件中会定义属性 net.kiminotes.value 呢?现在只需要记住属性名中的点在autoconfig执行的时候会被替换成下划线,具体原因会在后续的blog中解释。 

最后在pom中配置一下maven autoconfig插件,整个pom文件如下。 


Xml代码  收藏代码
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  2.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">   
  3.   <modelVersion>4.0.0</modelVersion>   
  4.    
  5.   <groupId>net.kiminotes</groupId>   
  6.   <artifactId>autoconfig</artifactId>   
  7.   <version>1.0-SNAPSHOT</version>   
  8.   <packaging>jar</packaging>   
  9.    
  10.   <build>   
  11. <plugins>   
  12. <plugin>   
  13. <groupId>com.alibaba.citrus.tool</groupId>   
  14. <artifactId>maven-autoconfig-plugin</artifactId>   
  15. <version>1.0.9</version>   
  16. <executions>   
  17. <!-- 配置在package phase中运行maven-autoconfig-plugin的autoconfig goal -->   
  18. <execution>   
  19. <id>config</id>   
  20. <goals>   
  21. <goal>autoconfig</goal>   
  22. </goals>   
  23. <phase>package</phase>   
  24. </execution>   
  25. </executions>   
  26. </plugin>   
  27. <plugin>   
  28. <artifactId>maven-jar-plugin</artifactId>   
  29. <configuration>   
  30. <archive>   
  31. <!-- 打出的jar包中的 MANIFEST.MF 文件中增加 Main-Class 这一项配置,这样就能在命令行中通过 java -jar 来执行打出的jar包 -->   
  32. <manifestEntries>   
  33. <Main-Class>net.kiminotes.Main</Main-Class>   
  34. </manifestEntries>   
  35. </archive>   
  36. </configuration>   
  37. </plugin>   
  38. <plugin>   
  39. <groupId>org.apache.maven.plugins</groupId>   
  40. <artifactId>maven-compiler-plugin</artifactId>   
  41. <version>2.3.2</version>   
  42. <configuration>   
  43. <target>1.6</target>   
  44. <source>1.6</source>   
  45. </configuration>   
  46. </plugin>   
  47. </plugins>   
  48.   </build>   
  49. </project>   


如果看不明白上面pom中插件的配置可以参加maven相关的一些书籍。 

在配置文件的模板 config.properties.vm 中有一个配置变量 ${net_kiminotes_value} 在执行autoconfig的时候需要被替换,那怎么给这个配置项赋值呢?autoconfig提供了两种方式来给配置变量赋值第一从java属性文件中读取第二是交互式地编辑。autoconfig首先读取当前工作目录的antx.properties文件,如果没有则读取${user.home}/antx.properties文件,如果这个文件也不存在,autoconfig就会启动交互式编辑器请求用户输入配置变量的值,如果配置变量的值是不完整的autoconfig则会立即停止配置并抛出一个异常。如果java属性文件的位置不在autoconfig默认的位置可以通过参数autoconfig.userProperties进行配置。处于简单其间,我们在当前目录新建一个java属性文件antx.properties,这个文件中定义了配置变量${net_kiminotes_value}的值。antx.properties 文件的内容如下。 

net.kiminotes.value = hello, world 

整个项目的结构如下所示: 


 

下面运行maven来build这个项目。运行 mvn package,在target目录下生成一个jar包autoconfig-1.0-SNAPSHOT.jar,运行这个jar包。 

 

本文介绍了一个自动化的配置工具autoconfig,虽然它能解决部署前的软件配置问题,但它同样有一个很关键的问题,与ide没有任何集成,给开发以及单元测试带来一定的麻烦,这就要靠各个使用者开动脑筋来解决这个问题了。 


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页