在Spring Boot中,即使没有设置适当的环境变量,如何为不同的配置文件构建JAR文件?

时间:2017-12-20 18:47:04

标签: spring maven spring-boot

我是Spring Boot的新手,所以请耐心等待。目前,我正在开发一个小应用程序,仅仅是为了学习Spring Boot。我的目标是使用AWS(弹性beanstalk)部署它。

到目前为止,我已经创建了三个应用程序属性文件:

  • application.properties:适用于所有配置文件的属性。
  • application-dev.properties:仅用于开发的属性。这包括与DB的本地主机连接,自签名密钥库的路径等。
  • application-prod.properties:仅用于prod的属性。这包括prod DB详细信息等。

使用dev配置文件在本地运行应用程序时,一切正常,因为所有内容都已在application-dev.properties中进行了硬编码。

但是,application-prod.properties文件包含将通过OS环境变量解析的引用,例如:

spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}  

我目前在本地操作系统中没有设置变量DB_USERNAMEDB_PASSWORD,我不希望这样做。但是当我运行以下命令时,它显然会失败:

mvn package spring-boot:repackage -Dspring.profiles.active=prod  

失败是因为它无法找到上述环境变量。

在我实际执行JAR之前,有没有办法延迟此检查?我的计划是在本地构建JAR,然后将其复制到我的prod服务器,并在那里运行它。 prod服务器肯定会有这些环境变量。

我发现的解决方法是:

mvn package spring-boot:repackage -Dspring.profiles.active=dev
java -jar -Dspring.profiles.active=prod [jar-file-name].jar  

然而,这感觉就像一个黑客。它可能会导致我现在无法想到的问题。

1 个答案:

答案 0 :(得分:0)

您可以在这些属性中使用所需的任何值作为产品概要文件。如果env变量存在,Spring将从那里获取值,而不是属性。

here所述:

  

Spring Boot使用一个非常特殊的PropertySource顺序,即   旨在合理地覆盖价值。属性是   按以下顺序考虑:

     

[...]

     
      
  1. OS环境变量。
  2.   
     

[...]

     
      
  1. 打包在jar中的特定于配置文件的应用程序属性(application- {profile} .properties和YAML变体)。
  2.   

因此,您的application-prod.properties如下所示:

spring.datasource.username=willBeOverridenByEnvValue
spring.datasource.password=willBeOverridenByEnvValue

您必须确保在产品服务器中同时设置了SPRING_DATASOURCE_USERNAMESPRING_DATASOURCE_PASSWORD env值