我有一个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吗?有更好的解决方案吗?
答案 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在哪里查找内容。然后,您可以列出目录或单个文件。最后一个属性为您提供了最大的灵活性,应该可以满足您的要求,但它可以为您提供更多的工作。