Spring Boot特定于环境的配置

pas*_*ian 3 environment jpa spring-mvc spring-boot microservices

我有一个使用执行器,自动配置和JPA的弹簧启动应用程序.我希望能够在我的测试配置文件中使用内存数据库,在开发期间使用MySQL数据库配置,并在应用程序部署到生产环境时使用单独的生产数据库配置.据推测,从java命令行我应该能够指定环境,并且将拾取application.properties(或.yml)中的正确配置文件或配置块.

我没有找到一个好的帖子,其中的例子描述了如何进行这种切换,所以我想我会问是否有人有一个很好的例子.我的主要目标是在构建时预先定义spring.datasource和spring.jpa属性,然后在运行时使用java命令行参数"动态"切换每个环境的应用程序配置.次要目标是对management配置等做同样的事情.

谢谢.

pas*_*ian 7

感谢@Richard提到spring.profiles.activeJVM变量.由于我的问题是针对Spring Boot这样做的方式而且由于答案还有很多,所以我倾向于自己回答这个问题并包括我如何得到答案的所有细节,希望能够节省其他时间.

首先,您可以java通过-Dspring.profiles.active=profile_name在运行Spring Boot应用程序时添加来在命令行中选择正确的配置文件.(这假设您的部署首选项是带有嵌入式容器的超级jar - 在我的情况下是Tomcat)

我想将MySQL数据源配置保留在默认配置文件下,并将H2内存数据源配置放在测试配置文件下.但是,Spring Boot 基于配置文件选择正确的数据源的方式并不那么明显.即使我在默认配置文件下有MySQL详细信息,并且我在测试配置文件下有内存中的H2数据源详细信息,但即使spring.profiles.active从命令行中省略,它仍然会选择H2作为数据源.这与我的假设相反,默认情况下会选择默认配置文件:-)

我最终不得不将H2配置放在默认配置文件下,然后创建一个包含MySQL数据源配置的本地配置文件.这就是我最终得到的application.yml

spring:
  profiles: default 

spring:
  datasource:
    driverClassName: org.h2.Driver
    url: jdbc:h2:mem:sampletest;MODE=MySQL

---
spring:
  profiles: test

spring.jpa:
    hibernate:
      ddl-auto: create-drop

---
spring:
  profiles: local

spring.datasource:
  driverClassName: com.mysql.jdbc.Driver
  url: jdbc:mysql://127.0.0.1/sampledev
  username: sample
  password: sample

spring.jpa:
  hibernate:
    dialect: org.hibernate.dialect.MySQLInnoDBDialect
    ddl-auto: update
Run Code Online (Sandbox Code Playgroud)

这很有效.我能够之间切换,默认的配置文件,并在当地通过省略或添加轮廓-Dspring.profiles.active=local上java的命令行.因为测试配置文件继承自默认值,所以它也使用H2

还有一个细微差别:我添加ddl-auto: create-drop到测试配置文件中,该配置文件使用内存数据库来促进单元测试的自动表创建/拆卸.但对于使用MySQL的本地配置文件,我将其更改为update.这意味着对于本地配置文件,我必须首先在应用程序之外创建数据库.