Spring Boot

时间:2015-08-20 15:07:21

标签: deployment spring-boot environment-variables configuration-management

我有一个Spring Boot应用程序,它通过以下脚本作为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 $1 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 submit-enrollment.properties )位于app根目录中的上述jar文件中,属性值来自它们通过@PropertySource和@Value注释读入各种bean,例如:

submit-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等)相对应,而不是单个submit-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 Boot参数,告诉我在哪个环境中运行它:

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

让Spring根据与上述参数对应的-env值自动解析正确的属性文件。这是目前作为Spring Boot功能的一部分存在的东西,如果有的话,有人可以指点我这样的样本设置。如果是,在您看来,这不是一个可行的方法,也许不是让Spring解析具有不同名称的.properties文件,而是将它们隔离到特定于环境的目录,同时让它们在整个环境中具有相同的名称,我是在Maven或Jenkins中使用它而不是在运行时使用Spring Boot吗?有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

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

Spring Boot支持profile specific properties开箱即用。因此,如果您启用uat个人资料,它会在常规位置查找application-uat.properties

如果您不希望application作为前缀,则可以指定SPRING_CONFIG_NAME system / os property to define a different name

如果这对您不起作用,您可以使用SPRING_CONFIG_LOCATION告诉Spring Boot在哪里查找内容。然后,您可以列出目录或单个文件。最后一个属性为您提供了最大的灵活性,应该可以满足您的要求,但它可以为您提供更多的工作。