Spring Boot 中特定于环境的外部化属性文件

Environment-specific externalizing properties file(s) in Spring Boot

我有一个 Spring 启动应用程序,它 运行 通过以下脚本(摘录)作为 jar 文件:

SERVICE_NAME=submit-enrollment
PID_PATH_NAME=~/submit-enrollment/application.pid
PATH_TO_JAR=~/submit-enrollment/submit-enrollment-1.0.0.jar
JVM_OPTS="-Xmx1g"
SPRING_OPTS="--logging.file=submit-enrollment-1.0.0.log"

case  in
    start)
        echo "Starting $SERVICE_NAME ..."
        if [ ! -f $PID_PATH_NAME ]; then
            nohup java $JVM_OPTS -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null $SPRING_OPTS &
                        echo $! > $PID_PATH_NAME
            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is already running ..."
        fi
    ;; .........

配置属性文件(目前2个:application.properties提交-enrollment.properties ) 驻留在应用程序根目录中的上述 jar 文件中,它们的 属性 值通过 @PropertySource 和 @Value 注释读入各种 bean,例如:

提交-enrollment.properties:

marshaller.contextPaths=c.f.e.a_e.e_1, c.f.e.a._1
default.Uri=https://i.h.c.com/I1/AEService  
soap.action=http://wsdl.business.services.ee.ffe.c.h.com/AEPT/CAMIPR
auditLog.server=10.172.x.xx
auditLog.port=8062

application.properties:

spring.main.show-banner=false
server.port=9278
logging.level.org.springframework.ws.client.core = DEBUG
logging.level.com.sun.xml.internal.messaging = DEBUG
#logging.level.org.springframework.ws.client.MessageTracing = TRACE
#logging.level.org.springframework.ws.client.MessageTracing.received = TRACE

=================================

@Configuration
@ComponentScan({"c.f.e", "c.z.submit.enrollment"})
@PropertySource("classpath:/submit-enrollment.properties")
public class SubmitEnrollmentConfig {

    @Value("${marshaller.contextPaths}")
    private String[] marshallerContextPaths;

    @Value("${default.Uri}")
    private String defaultUri;

==================================

@Service("soapClient")
public class FmfSoapClient extends WebServiceGatewaySupport {

@Value("${soap.action}")
private String soapAction;


@Value("${auditLog.server}")
private String auditLogServer;

@Value("${auditLog.port}")
private String auditLogPort;    

随着应用程序的增长,将添加其他 .properties 文件,可能与使用的 spring 组件类似,即 security.properties、web-services.properties、web-properties,等等 vs 单个提交-enrollment.properties 文件。

这是当前设置。我正在寻找的是以下内容:

问题:

我希望能够将 .properties 文件外部化以驻留在文件系统中的某个位置 在 jar 文件之外 以及将它们命名为反映环境的方式:

application-dev.properties
submit-enrollment-dev.properties

;;;;

application-uat.properties
submit-enrollment-uat.properties

;;;

application-prod.properties
submit-enrollment-prod.properties

我想在 shell 脚本中传递 Spring 启动一个参数,告诉我 运行 在哪个环境中设置它:

java -jar submit-enrollment.jar -environment=uat

并让 Spring 根据对应于上述参数的 -env- 值自动解析正确的属性文件。这是当前作为 Spring 启动功能的一部分存在的东西吗?如果可以的话,请指点我一些类似的示例设置。如果您认为这不是一种可行的方法,也许与其让 Spring 解析具有不同名称的 .properties 文件,不如将它们隔离到特定于环境的目录中,同时让它们在不同环境中具有相同的名称会更好环境,我应该求助于在 Maven 或 Jenkins 中做这件事,而不是让 Spring Boot 在 运行 时间做吗?有没有更好的解决方案?

问题是您想要更改文件名并让 Spring 引导自动选择您指定的环境。

Spring Boot 支持 profile specific properties 开箱即用。因此,如果您启用 uat 配置文件,它将在常用位置查找 application-uat.properties

如果你不喜欢application作为前缀,你可以指定SPRING_CONFIG_NAMEsystem/os属性to define a different name

如果这对您不起作用,您可以使用 SPRING_CONFIG_LOCATION 告诉 Spring 引导到哪里寻找东西。然后您可以列出目录或单个文件。最后一个 属性 为您提供了最大的灵活性,应该可以满足您的要求,但您需要做更多的工作。