【发布时间】:2017-09-29 18:42:06
【问题描述】:
我创建了一个将使用 Spring Boot 和 Gradle 的 Java 项目。我想为不同的环境配置配置文件(在我的本地机器上进行开发,在服务器场机器上进行集成测试的 systemtest 等)。我会将内存数据库中的 h2 用于开发环境,将 SqlServer 用于 systemtest 环境。在 build.gradle 我定义了以下依赖项
dependencies {
compile("org.springframework.boot:spring-boot-starter-data-jpa")
compile("org.springframework.boot:spring-boot-starter-web-services")
compile('org.springframework.boot:spring-boot-starter-actuator')
runtime('com.h2database:h2:1.4.195')
runtime('com.microsoft.sqlserver:mssql-jdbc')
}
我创建了一个 application.yml 文件 application-development.yml 和 application-systemtest.yml 我将在其中放置公共属性和特定于环境的属性。文件 application-systemtest.yml 定义了 sql server 的连接参数
spring:
datasource:
url: jdbc:sqlserver://<host>,1433;databaseName=MYDB
username: myuser
password: mypass
driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
jpa:
show-sql: true
hibernate:
dialect: org.hibernate.dialect.SQLServer2012Dialect
我还会创建一个 uber-jar 并选择配置文件作为启动参数,即
java -Dspring.profiles.active=systemtest -jar <my uber jar>
开发配置文件开始正常,我在内存数据库中的 h2 上运行。尝试 systemtest 配置文件时,spring boot 无法加载上下文并失败。这是由于 spring boot 发现 h2 依赖并尝试配置 application-systemtest.yml 中定义的数据源引起的
所以我修改了 build.gradle 依赖闭包
def profile = project.findProperty('spring.profiles.active')
dependencies {
compile("org.springframework.boot:spring-boot-starter-data-jpa")
compile("org.springframework.boot:spring-boot-starter-web-services")
compile('org.springframework.boot:spring-boot-starter-actuator')
if (profile == 'development') {
runtime('com.h2database:h2:1.4.195')
} else {
runtime('com.microsoft.sqlserver:mssql-jdbc')
}
}
这次 spring boot 正确启动。不太喜欢这个解决方案,因为我必须部分使用 Gradle 处理配置文件配置。我想知道是否有办法配置spring boot,以便配置文件在自身内部完全管理,解决开发环境中的h2和systemtest环境中的sqlserver,让Gradle不知道spring配置文件。
如何解决这个问题?
【问题讨论】:
-
为您正在使用的数据源实现的
systemtest配置文件显式指定spring.datasource.type。这样会跳过数据源检测(在检测进行时嵌入优先)。 -
我试图查看 Spring 文档,但无法找到可以分配给 spring.datasource.type 的值。文档相当模糊。我试图设置一个 Datasource 类,但它不起作用。
-
你应该设置一个数据源类...类似于
com.zaxxer.hikari.HikariDataSource。
标签: java gradle spring-boot