autoconfig配置工具使用

http://www.iteye.com/topic/1014149

对于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没有任何集成,给开发以及单元测试带来一定的麻烦,这就要靠各个使用者开动脑筋来解决这个问题了。 

附近是示例的所有源文件。 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值