在Java应用开发中,XML是常用的配置文件格式,Apache Commons Configuration提供了简洁的API来读取XML配置,无需手动解析XML节点,大幅降低了配置读取的开发成本。下面将从依赖引入到具体实现逐步讲解使用方式。

环境准备
首先需要在项目中引入Apache Commons Configuration的依赖,如果使用Maven构建项目,在pom.xml中添加如下依赖:
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>1.10</version>
</dependency>如果是Gradle项目,在build.gradle中添加如下依赖:
implementation 'commons-configuration:commons-configuration:1.10'
准备XML配置文件
首先创建一个测试用的XML配置文件,命名为config.xml,放在项目的resources目录下,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<app>
<name>测试应用</name>
<version>2.1.0</version>
<port>8080</port>
</app>
<database>
<driver>com.mysql.cj.jdbc.Driver</driver>
<url>jdbc:mysql://127.0.0.1:3306/test_db</url>
<username>root</username>
<password>123456</password>
<poolSize max="20" min="5">10</poolSize>
</database>
<modules>
<module>用户管理</module>
<module>订单管理</module>
<module>权限管理</module>
</modules>
</config>基础读取示例
使用XMLConfiguration类来读取XML配置,基础读取代码如下:
import org.apache.commons.configuration.XMLConfiguration;
import java.io.File;
public class ConfigReader {
public static void main(String[] args) {
try {
// 加载XML配置文件,路径根据实际项目调整
XMLConfiguration config = new XMLConfiguration(new File("src/main/resources/config.xml"));
// 读取普通节点内容,使用XPath风格的节点路径
String appName = config.getString("app.name");
String appVersion = config.getString("app.version");
int appPort = config.getInt("app.port");
System.out.println("应用名称:" + appName);
System.out.println("应用版本:" + appVersion);
System.out.println("应用端口:" + appPort);
} catch (Exception e) {
e.printStackTrace();
}
}
}上述代码中,通过节点路径直接获取对应内容,路径使用点分隔的层级结构,和XPath的表达式逻辑一致。
读取复杂配置内容
读取节点属性
XML节点可能带有属性,比如上述配置中的<poolSize>节点的max和min属性,读取方式如下:
import org.apache.commons.configuration.XMLConfiguration;
import java.io.File;
public class ConfigReader {
public static void main(String[] args) {
try {
XMLConfiguration config = new XMLConfiguration(new File("src/main/resources/config.xml"));
// 读取节点属性,格式为 节点路径[@属性名]
int maxPoolSize = config.getInt("database.poolSize[@max]");
int minPoolSize = config.getInt("database.poolSize[@min]");
int currentPoolSize = config.getInt("database.poolSize");
System.out.println("连接池最大大小:" + maxPoolSize);
System.out.println("连接池最小大小:" + minPoolSize);
System.out.println("连接池当前大小:" + currentPoolSize);
} catch (Exception e) {
e.printStackTrace();
}
}
}读取列表类型配置
如果XML中有多个同名的子节点,比如<modules>下的多个<module>节点,可以读取为列表:
import org.apache.commons.configuration.XMLConfiguration;
import java.io.File;
import java.util.List;
public class ConfigReader {
public static void main(String[] args) {
try {
XMLConfiguration config = new XMLConfiguration(new File("src/main/resources/config.xml"));
// 读取同名节点列表
List<Object> moduleList = config.getList("modules.module");
System.out.println("已启用模块:");
for (Object module : moduleList) {
System.out.println(module);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}常见注意事项
- XMLConfiguration默认支持XPath表达式,因此节点路径的写法和XPath规则一致,层级使用点分隔即可。
- 如果XML配置中有特殊字符,需要确保XML文件的编码格式正确,加载时编码和文件编码保持一致。
- 读取配置时如果节点不存在,会抛出异常,可以使用
containsKey方法先判断节点是否存在,避免程序报错。 - 如果需要修改配置并写回XML文件,可以调用XMLConfiguration的save方法,不过实际开发中通常配置只读,不建议运行时修改配置文件。
完整读取示例
下面是一个读取上述config.xml所有内容的完整示例:
import org.apache.commons.configuration.XMLConfiguration;
import java.io.File;
import java.util.List;
public class FullConfigReader {
public static void main(String[] args) {
try {
XMLConfiguration config = new XMLConfiguration(new File("src/main/resources/config.xml"));
// 读取应用配置
System.out.println("=== 应用配置 ===");
System.out.println("应用名称:" + config.getString("app.name"));
System.out.println("应用版本:" + config.getString("app.version"));
System.out.println("应用端口:" + config.getInt("app.port"));
// 读取数据库配置
System.out.println("\n=== 数据库配置 ===");
System.out.println("驱动类:" + config.getString("database.driver"));
System.out.println("数据库地址:" + config.getString("database.url"));
System.out.println("用户名:" + config.getString("database.username"));
System.out.println("密码:" + config.getString("database.password"));
System.out.println("连接池最大大小:" + config.getInt("database.poolSize[@max]"));
System.out.println("连接池最小大小:" + config.getInt("database.poolSize[@min]"));
System.out.println("连接池当前大小:" + config.getInt("database.poolSize"));
// 读取模块列表
System.out.println("\n=== 模块列表 ===");
List<Object> modules = config.getList("modules.module");
for (int i = 0; i < modules.size(); i++) {
System.out.println("模块" + (i + 1) + ":" + modules.get(i));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Apache_Commons_ConfigurationXML配置Java配置读取配置文件解析修改时间:2026-06-03 15:07:45