如何从 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"));
    }
}