Spring Boot 环境特定的配置

Posted

技术标签:

【中文标题】Spring Boot 环境特定的配置【英文标题】:Spring Boot Environment-specific configurations 【发布时间】:2014-09-07 09:29:53 【问题描述】:

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

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

谢谢。

【问题讨论】:

【参考方案1】:

感谢@Richard 提到spring.profiles.active JVM 变量。由于我的问题是针对 Spring Boot 执行此操作的方式的,并且由于答案还有很多,我倾向于自己回答这个问题,并将我如何得出答案的所有细节都包含在希望它能节省其他人的时间。

首先,您确实可以通过在运行 Spring Boot 应用程序时添加 -Dspring.profiles.active=profile_namejava 命令行上选择正确的配置文件。 (这是假设您的部署偏好是 带有嵌入式容器的 uber jar - 就我而言是 Tomcat)

我想将 MySQL 数据源配置保留在 default 配置文件下,并将 H2 内存数据源配置放在 test 个人资料。但是,Spring Boot 根据配置文件选择正确的 datasource 的方式并不那么明显。即使我在 default 配置文件下有 MySQL 详细信息,并且在 test 配置文件下有内存中 H2 数据源详细信息,它仍然会选择 H2 作为数据源,即使 @命令行中省略了 987654324@。这与我的假设相反,即默认情况下会选择 default 配置文件:-)

我最终不得不将 H2 配置放在 default 配置文件下,然后创建一个包含 MySQL 数据源配置的 local 配置文件。这是我在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

这行得通。通过在java 命令行上省略或添加-Dspring.profiles.active=local,我能够在default 配置文件和local 配置文件之间切换。因为测试配置文件继承自默认,它也使用 H2

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

【讨论】:

通过更新的方式,如果你使用的是maven spring-boot:run插件,你可以这样选择active profile:mvn spring-boot:run -Drun.arguments="--spring.profiles.active=myProfile" -Dsome.other.application.property=x 感谢某人不会增加答案的价值。请考虑用只有问题作为上下文的读者重写答案。【参考方案2】:

本文展示了如何使用 spring 配置文件,在 spring 3.1 及更高版本中可用。它会做你想做的事。

http://chariotsolutions.com/blog/post/spring-3-1-environment-profiles-2/

像这样设置一个 JVM 变量:spring.profiles.active=development

然后在您的配置 xml 中,您可以使用配置文件标签包装特定于环境的 xml

<beans profiles="development">  
  <bean id="dataSource" class="..."></bean>
  <bean id="messagingProvider" class="..."></bean>
</beans>

您还可以在类的开头使用@Profile("development") 为注释驱动的类设置配置文件。只有在配置文件匹配时,该类才会自动装配。

对于单元测试,您可以使用 @ActiveProfile(profiles = "test", "CI") 在测试类上设置活动配置文件,它将使用测试和 CI 资源运行

【讨论】:

谢谢理查德。我不认为将注释应用于 Spring Boot bean 会起作用,因为这些类必须在每个环境中工作,但我想我会尝试“spring.profiles.active”,看看是否有效。我还发现了这个方法的参考here

以上是关于Spring Boot 环境特定的配置的主要内容,如果未能解决你的问题,请参考以下文章

简单的Spring Boot 项目初级配置

spring boot 外部配置 - profile 特定配置

Spring Boot 无法从配置文件特定的 yaml 文件中读取

Spring Boot配置文件-多环境配置

Spring Boot 入门之基础篇

Spring Boot应用程序中的环境特定application.properties文件[关闭]