如何从 Spring Boot 应用程序之外的位置读取 application.properties 文件
Posted
技术标签:
【中文标题】如何从 Spring Boot 应用程序之外的位置读取 application.properties 文件【英文标题】:How to read the application.properties file from a location outside the spring boot application 【发布时间】:2022-01-18 14:10:14 【问题描述】:我有一个 Spring Boot 应用程序,我想从中排除 Spring Boot 中默认创建的 application.properties
并从另一个位置读取它。但是我注意到下面显示的配置文件总是会尝试获取项目中的application.properties
文件。
Config.java 文件:
package com.eMcREY.ChatServiceProject;
import org.springframework.beans.factory.annotation.Value;
@org.springframework.context.annotation.Configuration
public class Config
// private @Value("$project.testVar:defaultValue") String test;
// public String getTest()
// return test;
//
//
// public void setTest(String test)
// this.test = test;
//
// Openfire
private @Value("$openfire.customerKey") String customerKey;
private @Value("$openfire.customerSecret") String customerSecret;
private @Value("$openfire.host") String host;
private @Value("$openfire.port") int port;
private @Value("$openfire.clientPort") int clientKey;
public int getClientKey()
return clientKey;
public void setClientKey(int clientKey)
this.clientKey = clientKey;
public String getCustomerKey()
return customerKey;
public void setCustomerKey(String customerKey)
this.customerKey = customerKey;
public String getCustomerSecret()
return customerSecret;
public void setCustomerSecret(String customerSecret)
this.customerSecret = customerSecret;
public String getHost()
return host;
public void setHost(String host)
this.host = host;
public int getPort()
return port;
public void setPort(int port)
this.port = port;
pom:我已将它包含在 pom 中
<configuration>
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
</configuration>
我的问题是如何让这个config
文件从项目外的另一个位置读取application.properties
。
谢谢
【问题讨论】:
【参考方案1】:可以说,您的应用程序需要外部属性,例如 application.properties 和另一个属性文件 myapp.properties。这两个属性可以在同一个文件夹中,也可以在不同的文件夹中。有 3 种方法。
命令行参数
在第一种方法中,您只需将文件夹名称和属性名称作为命令行参数的一部分传递,如下所示:
java -jar myapp.jar --spring.config.name=application,myapp
--spring.config.location=classpath:/data/myapp/config,classpath:/data/myapp/external/config
环境变量
在第二种方法中,您可以将外部化配置详细信息配置到环境变量中,您的 Spring Boot 应用程序将从您的环境中读取它,如下所示:
set SPRING_CONFIG_NAME=application,myapp
set SPRING_CONFIG_LOCATION=classpath:/data/myapp/config,classpath:/data/myapp/external/config
java -jar myapp.jar
以编程方式加载配置
package com.java2novice.springboot;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
@SpringBootApplication
public class SpringBootWebApplication
private static Logger logger = LoggerFactory.getLogger(SpringBootWebApplication.class);
public static void main(String[] args) throws Exception
ConfigurableApplicationContext applicationContext = new SpringApplicationBuilder(SpringBootWebApplication.class)
.properties("spring.config.name:application,myapp",
"spring.config.location:classpath:/data/myapp/config,classpath:/data/myapp/external/config")
.build().run(args);
ConfigurableEnvironment environment = applicationContext.getEnvironment();
logger.info(environment.getProperty("cmdb.resource-url"));
【讨论】:
【参考方案2】:请在使用外部 application.properties 时参考以下链接了解所有可能的选项 -
https://docs.spring.io/spring-boot/docs/2.5.6/reference/htmlsingle/#features.external-config.files
【讨论】:
【参考方案3】:通过使用注解PropertySource
如果文件在类路径中:
@Configuration
@PropertySource(value="classpath:org/springframework/context/annotation/p1.properties")
public class Config
如果文件是外部的:
@PropertySource("file:/external/path/to/application.properties")
public class Config
【讨论】:
【参考方案4】:根据spring文档:
具体到你的问题,你可以使用这个解决方案:Application property files
Spring Boot 使用一个非常特殊的 PropertySource
顺序,旨在允许合理地覆盖值,按以下顺序考虑属性:
1.命令行参数。
2.Java系统属性(System.getProperties()
)。
3.OS环境变量。
4.@PropertySource
@Configuration 类上的注释。
5 打包 jar 之外的应用程序属性(application.properties
包括 YAML 和配置文件变体)。
6.应用程序属性打包在您的 jar 中(application.properties
包括 YAML 和配置文件变体)。
7.默认属性(使用SpringApplication.setDefaultProperties
指定)。
这里的每个配置都有来自 spring it-self 的详细文档:features-external-config
【讨论】:
以上是关于如何从 Spring Boot 应用程序之外的位置读取 application.properties 文件的主要内容,如果未能解决你的问题,请参考以下文章
在 Spring Boot 中从命令行设置活动配置文件和配置位置
spring-boot中如何配置tomcat访问日志的位置和名称?
使用spring boot loader WarLauncher时如何在war文件之外加载属性文件?