Java 加载配置文件顺序

在Java开发中,配置文件是一种常见的用于存储应用程序设置的方式。配置文件可以包含各种参数和选项,用于配置应用程序的行为。Java提供了多种读取配置文件的方式,但不同的加载顺序可能会导致不同的配置优先级。本文将介绍Java加载配置文件的顺序,并通过代码示例展示不同加载顺序的效果。

加载配置文件的顺序

Java加载配置文件的顺序通常遵循以下规则:

  1. 首先,Java会根据系统属性(System Properties)加载配置文件。系统属性是在Java虚拟机启动时通过命令行参数或程序代码设置的。例如,可以通过-D参数设置系统属性,如java -Dconfig.file=config.properties MyApp。在代码中通过System.getProperty(key)方法获取系统属性值。

  2. 如果系统属性中没有找到配置文件,则Java会查找类路径(Classpath)中的配置文件。类路径是Java虚拟机用来加载类和资源文件的路径。可以通过-classpath-cp参数设置类路径,也可以通过在代码中调用ClassLoader.getResourceAsStream(name)方法获取类路径下的资源文件。

  3. 如果在类路径中没有找到配置文件,则Java会使用默认的配置文件。默认配置文件是应用程序内置的,通常以某种固定的名称存在。可以通过在代码中调用ClassLoader.getResourceAsStream(name)方法获取默认配置文件。

通过以上加载顺序,Java可以根据具体的需求来选择使用不同的配置文件。例如,可以通过系统属性来指定特定的配置文件,或者使用类路径中的配置文件作为默认配置。

示例代码

为了演示Java加载配置文件的顺序,我们将编写一个简单的代码示例。假设我们的应用程序需要加载一个名为config.properties的配置文件,该文件包含一个名为message的配置项。我们将使用不同的加载顺序来设置message的值,并输出结果。

首先,我们创建一个ConfigLoader类来加载配置文件并获取配置项的值:

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class ConfigLoader {
    private static final String DEFAULT_CONFIG_FILE = "default.properties";
    private static final String CONFIG_FILE = "config.properties";

    public static void main(String[] args) {
        Properties properties = new Properties();

        // 1. 从系统属性加载配置文件
        String configFile = System.getProperty("config.file");
        if (configFile != null) {
            loadPropertiesFromPath(properties, configFile);
        }

        // 2. 从类路径加载配置文件
        if (properties.isEmpty()) {
            loadPropertiesFromClasspath(properties, CONFIG_FILE);
        }

        // 3. 加载默认配置文件
        if (properties.isEmpty()) {
            loadPropertiesFromClasspath(properties, DEFAULT_CONFIG_FILE);
        }

        // 输出配置项的值
        String message = properties.getProperty("message");
        System.out.println("message: " + message);
    }

    private static void loadPropertiesFromPath(Properties properties, String path) {
        try (InputStream inputStream = ConfigLoader.class.getResourceAsStream(path)) {
            if (inputStream != null) {
                properties.load(inputStream);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void loadPropertiesFromClasspath(Properties properties, String name) {
        try (InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream(name)) {
            if (inputStream != null) {
                properties.load(inputStream);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在示例代码中,我们首先创建了一个Properties对象来存储配置文件的属性。然后,按照上述加载顺序逐步加载配置文件。最后,我们输出配置项message的值。

接下来,我们创建一个config.properties文件和一个default.properties文件,分别放置在类路径下和当前目录下,并在各自的配置文件中设置不同的message值。

config.properties文件内容如下:

message=Hello from config.properties

default.properties文件内容如下:

message=Hello from default.properties

运行程序时,我们可以通过命令行参数或代码设置系统属性来指定配置文件的路径。我们将分别演示三种加载顺序的效果。

演示1:通过系统属性加载配置文件

首先,我们使用命令行参数来指定配置文件