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

9udxz4iz  于 2022-11-05  发布在  Spring
关注(0)|答案(2)|浏览(202)

我需要获取Sping Boot 中当前活动配置文件的绝对路径,这些文件不在类路径或资源中
它可以位于默认位置-项目文件夹,子文件夹“config”,通过spring.config.location设置,也可以位于随机位置,也可以位于另一个磁盘中。
类似于“E:\项目\配置\我的项目\应用程序.yml”的内容

pgky5nke

pgky5nke1#

假设您在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的绝对路径

kcrjzv8t

kcrjzv8t2#

有一天我在这里发现了同样的问题,但现在找不到了
这是我的解决方案,也许有人需要它

@Autowired
    private ConfigurableEnvironment env;

    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;
    }

我想这不是最好的解决方案,但它很有效
如果你有任何改进的想法,我会非常感激

相关问题