3

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

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

谢谢你。

4

2 回答 2

8

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

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

我想将MySQL数据源配置保留在默认配置文件下,并将H2内存数据源配置放在测试配置文件下。但是,Spring Boot根据配置文件选择正确的数据源的方式并不那么明显。即使我在默认配置文件下有 MySQL 详细信息,并且我在测试spring.profiles.active配置文件下有内存中 H2 数据源详细信息,但即使在命令行中省略了它,它仍然会选择 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

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

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

于 2014-07-18T17:47:33.010 回答
0

本文展示了如何使用 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 资源运行

于 2014-07-16T20:11:28.313 回答