【问题标题】:Managing dependencies with spring boot profiles and Gradle使用 Spring Boot 配置文件和 Gradle 管理依赖项
【发布时间】: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


【解决方案1】:

不建议根据数据库产品使用不同的工件/二进制文件。尝试按照@M 的建议配置数据源/Spring 配置文件。 Deinum 以防止在使用不同的 DB 时将数据源配置为 H2。

【讨论】:

    猜你喜欢
    • 2022-12-23
    • 2021-05-09
    • 2018-08-24
    • 2012-10-25
    • 2016-09-17
    • 2019-01-30
    • 2019-07-16
    • 2018-01-31
    • 2015-06-28
    相关资源
    最近更新 更多