Spring Boot - 在运行时获取当前配置文件路径

Spring Boot - get current configuration file path in runtime

我需要获取 Spring 引导中当前活动配置文件的绝对路径,该文件不在类路径或资源中

它可以位于默认位置 - 项目文件夹,子文件夹“config”,通过spring.config.location设置,也可以在随机位置,也可以在另一个磁盘中

类似“E:\projects\configs\myProject\application.yml”的内容

有一天我在这里发现了同样的问题,但现在找不到了

所以这是我的解决方案,也许有人需要它

    @Autowired
    private ConfigurableEnvironment env;
    private static final String YAML_NAME = "application.yml";

    private String getYamlPath() throws UnsupportedEncodingException {
        String projectPath = System.getProperty("user.dir");
        String decodedPath = URLDecoder.decode(projectPath, "UTF-8");

        //Get all properies
        MutablePropertySources propertySources = env.getPropertySources();

        String result = null;
        for (PropertySource<?> source : propertySources) {
            String sourceName = source.getName();
            
            //If configuration loaded we can find properties in environment with name like
            //"Config resource '...[absolute or relative path]' via ... 'path'"
            //If path not in classpath -> take path in brackets [] and build absolute path

            if (sourceName.contains("Config resource 'file") && !sourceName.contains("classpath")) {
                String filePath = sourceName.substring(sourceName.indexOf("[") + 1, sourceName.indexOf("]"));
                if (Paths.get(filePath).isAbsolute()) {
                    result = filePath;
                } else {
                    result = decodedPath + File.separator + filePath;
                }
                break;
            }
        }

        //If configuration not loaded - return default path
        return result == null ? decodedPath + File.separator + YAML_NAME : result;
    }

我想这不是最好的解决方案,但它确实有效

如果您有任何改进的想法,我将不胜感激

假设您在 resources 文件夹中有这些 application-{env}.yml 配置文件,我们将激活 dev 配置。

application.yml
application-dev.yml
application-prod.yml
application-test.yml 
...

您可以通过两种方式激活 dev :

  1. 修改你的application.yml,
spring:
  profiles:
    active: dev
  1. 或者在您想要启动应用程序时通过命令行:
java -jar -Dspring.profiles.active=dev application.jar

然后,在您的程序中尝试此代码:

    // get the active config dynamically
    @Value("${spring.profiles.active}")
    private String activeProfile;

    public String readActiveProfilePath() {
        try {
            URL res = getClass().getClassLoader().getResource(String.format("application-%s.yml", activeProfile));
            if (res == null) {
                res = getClass().getClassLoader().getResource("application.yml");
            }
            File file = Paths.get(res.toURI()).toFile();
            return file.getAbsolutePath();
        } catch (Exception e) {
            // log the error.
            return "";
        }
    }

输出将是application-dev.yml

的绝对路径