Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc Spring引导环境特定配置_Spring Mvc_Jpa_Spring Boot_Environment_Microservices - Fatal编程技术网

Spring mvc Spring引导环境特定配置

Spring mvc Spring引导环境特定配置,spring-mvc,jpa,spring-boot,environment,microservices,Spring Mvc,Jpa,Spring Boot,Environment,Microservices,我有一个spring boot应用程序,它使用执行器、自动配置和JPA。我希望能够在我的测试配置文件中使用内存中的DB,在开发期间使用MySQL DB配置,在应用部署到生产中时使用单独的生产DB配置。大概从java命令行我可以指定环境,并在应用程序中选择正确的配置文件或配置块 我还没有找到一篇很好的文章来举例说明如何进行这种转换,所以我想问问是否有人有一个很好的例子。我的主要目标是在构建时预定义spring.datasource和spring.jpa属性,然后在运行时使用java命令行参数“动态

我有一个spring boot应用程序,它使用执行器、自动配置和JPA。我希望能够在我的测试配置文件中使用内存中的DB,在开发期间使用MySQL DB配置,在应用部署到生产中时使用单独的生产DB配置。大概从java命令行我可以指定环境,并在应用程序中选择正确的配置文件或配置块

我还没有找到一篇很好的文章来举例说明如何进行这种转换,所以我想问问是否有人有一个很好的例子。我的主要目标是在构建时预定义
spring.datasource
spring.jpa
属性,然后在运行时使用java命令行参数“动态”切换每个环境的应用程序配置。次要目标是对
管理
配置等执行相同的操作


谢谢。

本文介绍如何使用spring配置文件,spring 3.1及更高版本中提供了这些配置文件。它会完全满足你的要求

设置如下的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资源运行,这要感谢@Richard提到的
spring.profiles.active
JVM变量。由于我的问题是针对Spring Boot的具体方式而提出的,而且答案还有很多,因此我倾向于自己回答这个问题,并包括我如何得出答案的所有细节,以期节省其他人的时间

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

我想将MySQL数据源配置放在默认配置文件下,并将H2内存中的数据源配置放在测试配置文件下。然而,Spring Boot根据概要文件选择正确数据源的方式并不明显。尽管我在默认配置文件下有MySQL详细信息,在测试配置文件下有内存中的H2数据源详细信息,但即使命令行中省略了
spring.profiles.active
,它仍然会选择H2作为数据源。这与我的假设相反,默认情况下,默认配置文件将被选中:-)

最后,我不得不将H2配置放在默认配置文件下,然后创建一个包含MySQL数据源配置的本地配置文件。下面是我在
应用程序中得到的结果。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
,我可以在默认配置文件和本地配置文件之间切换。因为测试配置文件继承了默认配置文件,所以它也使用H2


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

谢谢你,理查德。我不认为将注释应用于SpringBootBean会起作用,因为这些类必须在每个环境中都能工作,但我认为我会尝试“spring.profiles.active”,看看这是否有效。我还通过更新找到了对该方法的引用,如果您使用的是maven spring boot:run插件,您可以通过以下方式选择活动配置文件:
mvn spring boot:run-Drun.arguments=“--spring.profiles.active=myProfile”-Dsome.other.application.property=x
感谢某人没有给答案增加价值。请考虑改写的答案,读者只有问题的背景。