我有一个使用执行器,自动配置和JPA 的弹簧启动应用程序。我希望能够在测试配置文件中使用内存数据库,在开发期间使用MySQL数据库配置,以及单独的生产数据库配置在应用程序部署到生产中时。据推测,从java命令行我应该能够指定环境,并且将选择正确的配置文件或 application.properties (或.yml)中的配置块。
我还没有找到一篇很好的帖子,其中有一个例子描述了如何进行这种切换,所以我想我会问是否有人有一个很好的例子。我的主要目标是在构建时预先定义spring.datasource
和spring.jpa
属性,然后在运行时使用java命令行参数“动态”切换每个环境的app配置。次要目标是对management
配置等进行相同的操作。
谢谢。
答案 0 :(得分:7)
感谢@Richard提到spring.profiles.active
JVM变量。由于我的问题特定于 Spring Boot 这样做的方式,而且由于答案还有很多,我倾向于自己回答这个问题并包括我如何得到答案的所有细节。希望它能节省其他时间。
首先,您可以通过在运行Spring Boot应用程序时添加java
来在-Dspring.profiles.active=profile_name
命令行中选择正确的配置文件。 (假设您的部署首选项是具有嵌入式容器的超级jar - 在我的情况下为Tomcat)
我想在默认配置文件下保留 MySQL 数据源配置,并将 H2 内存数据源配置放在 test < / em>个人资料。但是,Spring Boot根据配置文件选择正确的数据源的方式并不那么明显。即使我在默认配置文件下有MySQL详细信息,并且我在 test 配置文件下有内存中的H2数据源详细信息,它仍然会选择H2作为数据源,即使{命令行中省略了{1}}。这与我的假设相反,默认情况下会选择默认配置文件: - )
我最终不得不在默认配置文件下放置H2配置,然后创建一个包含MySQL数据源配置的 本地 配置文件。这是我在spring.profiles.active
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
命令行上的-Dspring.profiles.active=local
,我可以在默认配置文件和本地配置文件之间切换。因为测试配置文件继承自默认值,所以它也使用H2
还有一个细微差别:我将java
添加到 test 配置文件中,该配置文件使用内存数据库来促进单元测试的自动表创建/拆除。但对于使用MySQL的本地配置文件,我将其更改为ddl-auto: create-drop
。这意味着对于本地配置文件,我必须首先在应用程序之外创建数据库。
答案 1 :(得分:0)
本文介绍了如何使用弹簧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(&#34; development&#34;)在注释驱动的类上设置配置文件。只有在配置文件匹配时,该类才会自动装配。
对于单元测试,您可以使用@ActiveProfile(profiles =&#34; test&#34;,&#34; CI&#34;)在测试类上设置活动配置文件,它将使用测试和CI资源运行< / p>