configuration
Apache commons-configuration 是一个开源组件,可以方便的对项目中的配置文件进行读取和保存,本文只说明如何使用该组件读取项目中的配置文件(以ini、properties、xml文件为例),保存另文描述。
首先,需要添加相关的jar,我使用的是1.7版本,利用maven导入jar包:
除了commons-configuration.jar以外,maven会自动添加其依赖的相关jar,如commons-collections、commons-lang等。
注意,如果要使用XML作为项目配置文件,并且需要使用XPath对配置文件进行查询的话,还需要添加commons-jxpath组件,利用maven导入jar包:
在src/main/resources下新建一个类,命名为ConfigApp;
在src/main/resources下新建一个config文件夹,在config文件夹中新建三个配置文件:
cfg .ini (ini文件的简述,百度百科:baike.baidu.com/view/509647.htm)
[plain] view plain copy
- [os]
- edition = windows7
cfg.properites
[plain] view plain copy
- platform.jre = 1.7
cfg.xml
[html] view plain copy
- <?**xml version=”1.0” encoding=”UTF-8”?>**
- <**college**>
- <**student name=”foo” gender=”M”>**
- <**score course=”Algorithm”>97</score>**
- <**score course=”Operating System”>97</score>**
- </**student**>
- <**student name=”bar” gender=”F”>**
- <**score course=”Algorithm”>86</score>**
- <**score course=”Operating System”>91</score>**
- </**student**>
- <**teacher**>
- <**name**>tee</**name**>
- <**age**>31</**age**>
- </**teacher**>
- </**college**>
(1)使用commons-configuration读取properites文件
properties文件是Java平台默认的配置文件格式,其优点是格式清晰,简单易懂,使用commons-configuration读取properties文件也比较简单,代码如下:
[java] view plain copy
- public static void readProperties() throws ConfigurationException {
- PropertiesConfiguration pcfg = new PropertiesConfiguration(“config/cfg.properties”);
- System.out.println(pcfg.getString(“platform.jre”));
- }
注意,这里的路径一定要搞清楚,配置文件是放在config文件夹中的;
(2)使用commons-configuration读取ini文件
ini文件是windows平台上的一种配置文件格式,之所以将读取这种配置文件写在这里是因为:在Eclipse中编辑properties文件时,中文会显示为乱码,但是ini文件不会。读取INI文件的代码也非常简单,代码如下:
[java] view plain copy
- public static void readFromIni() throws ConfigurationException {
- HierarchicalINIConfiguration ini = new HierarchicalINIConfiguration(“config/cfg.ini”);
- System.out.println(“2. read configuration from cfg.ini…”);
- System.out.println(“os.edition = “ + ini.getString(“os.edition”));
- System.out.println();
- }
(3)使用commons-configuration读取xml文件
xml是最常用与配置文件,commons-configuration对xml的支持也非常完善,其读取xml文件有两种方式,一种是简单化的,使用“.”作为分隔符,如果配置文件较简单,可以使用这种方式,另一种是使用XPath作为查询方法,在配置文件中进行查询后返回结果,这种方式一般用于较复杂的配置文件。读取xml配置文件的代码如下:
[java] view plain copy
- public static void readFromXml() throws ConfigurationException {
- XMLConfiguration xml = new XMLConfiguration(“config/cfg.xml”);
- System.out.println(“3. read configuration from cfg.xml…”);
- // XML配置文件的简单使用(不使用XPath)
- System.out.println(“3.1 simple use..”);
- System.out.println(“teacher’s name = “ + xml.getString(“teacher.name”));
- System.out.println(“teacher’s age = “ + xml.getString(“teacher.age”));
- // 使用XPath查询配置文件
- System.out.println(“3.2 use xpath…”);
- xml.setExpressionEngine(new XPathExpressionEngine());
- // 查询姓名为foo的学生的算法课成绩
- String expr1 = “/student[@name=’foo’]/score[@course=’Algorithm’]“;
- System.out.println(“foo’s algorithm score = “ + xml.getString(expr1));
- // 查询所有学生的算法课成绩
- String expr2 = “/student//score[@course=’Algorithm’]“;
- System.out.println(“all students algorithm’s score = “ + Arrays.toString(xml.getStringArray(expr2)));
- // 查询姓名为foo的学生的性别
- String expr3 = “/student[@name=’foo’]/@gender”;
- System.out.println(“foo’s gender = “ + xml.getString(expr3));
- System.out.println();
需要注意的是,如果需要使用XPath进行查询,应该先执行
[java] view plain copy
- xml.setExpressionEngine(new XPathExpressionEngine());
方法。
(4)组合配置
目前,一般大点的项目都会有多个配置文件,将不同的配置项分类存储于多个配置文件中,这样必然会在项目中包含多个配置类,编写代码与维护都不方便。commons-configuration提供了一种配置组合机制。可以将所有的配置对象组合于一个CompositeConfiguration对象,这样就可以将若干个配置对象组合到一起,只对该组合配置对象进行操作即可。主要代码如下:
[java] view plain copy
- public static void readFromCompositeConfig() throws ConfigurationException {
- System.out.println(“4. composite all configurations…”);
- CompositeConfiguration configurations = new CompositeConfiguration();
- HierarchicalINIConfiguration ini = new HierarchicalINIConfiguration(“config/cfg.ini”);
- PropertiesConfiguration props = new PropertiesConfiguration(“config/cfg.properties”);
- XMLConfiguration xml = new XMLConfiguration(“config/cfg.xml”);
- xml.setExpressionEngine(new XPathExpressionEngine());
- configurations.addConfiguration(ini);
- System.out.println(“add ini to composite configuration…”);
- configurations.addConfiguration(props);
- System.out.println(“add properties to composite configuration…”);
- configurations.addConfiguration(xml);
- System.out.println(“add xml to composite configuration…”);
- System.out.println(“platform.jre = “ + configurations.getString(“platform.jre”));
- System.out.println(“os.edition = “ + configurations.getString(“os.edition”));
- String expr1 = “/student[@name=’foo’]/score[@course=’Algorithm’]“;
- System.out.println(“foo’s algorithm score = “ + configurations.getString(expr1));
- }
其实使用方法非常简单,首先根据需求生成配置对象,一个配置对象一般对应一个配置文件,然后生成一个CompositeConfiguration对象,将这些配置对象add到里面,然后就可以使用类似getString()、getInteger()、getStringArray()、getList()等等方法来操作配置项了。
ConfigApp类的全部代码如下:
[java] view plain copy
- package org.semicloud.study.config;
- import java.util.Arrays;
- import org.apache.commons.configuration.CompositeConfiguration;
- import org.apache.commons.configuration.ConfigurationException;
- import org.apache.commons.configuration.HierarchicalINIConfiguration;
- import org.apache.commons.configuration.PropertiesConfiguration;
- import org.apache.commons.configuration.XMLConfiguration;
- import org.apache.commons.configuration.tree.xpath.XPathExpressionEngine;
- public class ConfigApp {
- public static void main(String[] args) throws ConfigurationException {
- readFromProperties();
- readFromIni();
- readFromXml();
- readFromCompositeConfig();
- }
- public static void readFromProperties() throws ConfigurationException {
- PropertiesConfiguration pcfg = new PropertiesConfiguration(“config/cfg.properties”);
- System.out.println(“1. read configuration from cfg.properties…”);
- System.out.println(“platform.jre = “ + pcfg.getString(“platform.jre”));
- System.out.println();
- }
- public static void readFromIni() throws ConfigurationException {
- HierarchicalINIConfiguration ini = new HierarchicalINIConfiguration(“config/cfg.ini”);
- System.out.println(“2. read configuration from cfg.ini…”);
- System.out.println(“os.edition = “ + ini.getString(“os.edition”));
- System.out.println();
- }
- public static void readFromXml() throws ConfigurationException {
- XMLConfiguration xml = new XMLConfiguration(“config/cfg.xml”);
- System.out.println(“3. read configuration from cfg.xml…”);
- // XML配置文件的简单使用(不使用XPath)
- System.out.println(“3.1 simple use..”);
- System.out.println(“teacher’s name = “ + xml.getString(“teacher.name”));
- System.out.println(“teacher’s age = “ + xml.getString(“teacher.age”));
- // 使用XPath查询配置文件
- System.out.println(“3.2 use xpath…”);
- xml.setExpressionEngine(new XPathExpressionEngine());
- // 查询姓名为foo的学生的算法课成绩
- String expr1 = “/student[@name=’foo’]/score[@course=’Algorithm’]“;
- System.out.println(“foo’s algorithm score = “ + xml.getString(expr1));
- // 查询所有学生的算法课成绩
- String expr2 = “/student//score[@course=’Algorithm’]“;
- System.out.println(“all students algorithm’s score = “ + Arrays.toString(xml.getStringArray(expr2)));
- // 查询姓名为foo的学生的性别
- String expr3 = “/student[@name=’foo’]/@gender”;
- System.out.println(“foo’s gender = “ + xml.getString(expr3));
- System.out.println();
- }
- public static void readFromCompositeConfig() throws ConfigurationException {
- System.out.println(“4. composite all configurations…”);
- CompositeConfiguration configurations = new CompositeConfiguration();
- HierarchicalINIConfiguration ini = new HierarchicalINIConfiguration(“config/cfg.ini”);
- PropertiesConfiguration props = new PropertiesConfiguration(“config/cfg.properties”);
- XMLConfiguration xml = new XMLConfiguration(“config/cfg.xml”);
- xml.setExpressionEngine(new XPathExpressionEngine());
- configurations.addConfiguration(ini);
- System.out.println(“add ini to composite configuration…”);
- configurations.addConfiguration(props);
- System.out.println(“add properties to composite configuration…”);
- configurations.addConfiguration(xml);
- System.out.println(“add xml to composite configuration…”);
- System.out.println(“platform.jre = “ + configurations.getString(“platform.jre”));
- System.out.println(“os.edition = “ + configurations.getString(“os.edition”));
- String expr1 = “/student[@name=’foo’]/score[@course=’Algorithm’]“;
- System.out.println(“foo’s algorithm score = “ + configurations.getString(expr1));
- }
- }
还没有评论,来说两句吧...