我需要在Spring引导中获得不在类路径或资源中的当前活动配置文件的绝对路径
它可以位于默认位置-项目文件夹、子文件夹";config";,通过spring.config.location和随机位置设置,也在另一个磁盘中
类似于";E: \projects\configs\myProject\application.yml">
假设resources
文件夹中有这些application-{env}.yml
配置文件,我们将激活dev
配置。
application.yml
application-dev.yml
application-prod.yml
application-test.yml
...
有两种方法可以激活dev
:
- 修改您的CCD_ 5
spring:
profiles:
active: dev
- 或通过命令行启动应用程序:
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
的绝对路径
有一天我在这里发现了同样的问题,但现在找不到了
所以这里是我的解决方案,也许有人需要它
@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;
}
我想这不是最好的解决方案,但它可以
如果你知道如何改进它,我将非常感谢