我需要获取Sping Boot 中当前活动配置文件的绝对路径,这些文件不在类路径或资源中它可以位于默认位置-项目文件夹,子文件夹“config”,通过spring.config.location设置,也可以位于随机位置,也可以位于另一个磁盘中。类似于“E:\项目\配置\我的项目\应用程序.yml”的内容
pgky5nke1#
假设您在resources文件夹中有这些application-{env}.yml配置文件,我们将激活dev配置。
resources
application-{env}.yml
dev
application.yml application-dev.yml application-prod.yml application-test.yml ...
激活dev的方法有两种:1.修改您application.yml,
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的绝对路径
application-dev.yml
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; }
我想这不是最好的解决方案,但它很有效如果你有任何改进的想法,我会非常感激
2条答案
按热度按时间pgky5nke1#
假设您在
resources
文件夹中有这些application-{env}.yml
配置文件,我们将激活dev
配置。激活
dev
的方法有两种:1.修改您
application.yml
,1.或者在您希望启动应用程序时通过命令行:
然后,在程序中尝试以下代码:
输出将是
application-dev.yml
的绝对路径kcrjzv8t2#
有一天我在这里发现了同样的问题,但现在找不到了
这是我的解决方案,也许有人需要它
我想这不是最好的解决方案,但它很有效
如果你有任何改进的想法,我会非常感激