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
:
- 修改你的
application.yml
,
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
的绝对路径
我需要获取 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
:
- 修改你的
application.yml
,
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