如何从 spring 启动应用程序之外的位置读取 application.properties 文件
How to read the application.properties file from a location outside the spring boot application
我有一个 spring 引导应用程序,我想从中排除在 spring 引导中默认创建的 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
。
谢谢
通过使用注释 PropertySource
如果文件在类路径中:
@Configuration
@PropertySource(value="classpath:org/springframework/context/annotation/p1.properties")
public class Config {
}
如果文件是外部文件:
@PropertySource("file:/external/path/to/application.properties")
public class Config {
}
使用外部 application.properties -
时,请参阅下面的所有可能选项 link
https://docs.spring.io/spring-boot/docs/2.5.6/reference/htmlsingle/#features.external-config.files
根据 spring 文档:
具体到你的问题,你可以使用这个解决方案:Application property files
Spring 引导使用非常特殊的 PropertySource
顺序,旨在允许合理地覆盖值,按以下顺序考虑属性:
1.Command 行参数。
2.Java 系统属性(System.getProperties()
)。
3.OS 环境变量。
4.@PropertySource
@Configuration 注释 类.
5 个应用程序属性在打包的 jar 之外(application.properties
包括 YAML 和配置文件变体)。
6.Application 属性打包在您的 jar 中(application.properties
包括 YAML 和配置文件变体)。
7.Default 属性(使用 SpringApplication.setDefaultProperties
指定)。
对于每个配置,这里都有来自 spring 的详细文档:features-external-config
比方说,您的应用程序需要外部化属性,例如 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 启动应用程序将从您的环境中读取它,如下所示:
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"));
}
}
我有一个 spring 引导应用程序,我想从中排除在 spring 引导中默认创建的 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
。
谢谢
通过使用注释 PropertySource
如果文件在类路径中:
@Configuration
@PropertySource(value="classpath:org/springframework/context/annotation/p1.properties")
public class Config {
}
如果文件是外部文件:
@PropertySource("file:/external/path/to/application.properties")
public class Config {
}
使用外部 application.properties -
时,请参阅下面的所有可能选项 linkhttps://docs.spring.io/spring-boot/docs/2.5.6/reference/htmlsingle/#features.external-config.files
根据 spring 文档:
具体到你的问题,你可以使用这个解决方案:Application property files
Spring 引导使用非常特殊的 PropertySource
顺序,旨在允许合理地覆盖值,按以下顺序考虑属性:
1.Command 行参数。
2.Java 系统属性(System.getProperties()
)。
3.OS 环境变量。
4.@PropertySource
@Configuration 注释 类.
5 个应用程序属性在打包的 jar 之外(application.properties
包括 YAML 和配置文件变体)。
6.Application 属性打包在您的 jar 中(application.properties
包括 YAML 和配置文件变体)。
7.Default 属性(使用 SpringApplication.setDefaultProperties
指定)。
对于每个配置,这里都有来自 spring 的详细文档:features-external-config
比方说,您的应用程序需要外部化属性,例如 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 启动应用程序将从您的环境中读取它,如下所示:
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"));
}
}