You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中Liquibase未读取application.yml配置的问题咨询

Spring Boot + Liquibase + H2 问题排查与解决

1. 表未出现在指定H2内存库位置,反而生成在随机内存位置

原因

  • Liquibase与Spring Boot使用了不同的数据源配置:比如liquibase.properties里的JDBC URL和application.yml中spring.datasource.url不一致,导致Liquibase连接了另一个独立的H2内存实例。
  • H2内存模式特性:mem:后未指定固定名称时,会自动生成随机名称的内存库;多数据源未共享同一URL时,就会出现多个独立库。
  • H2控制台连接URL错误:打开控制台时用的URL和应用实际连接的URL不匹配,导致看不到正确的库。

解决方案

  • 统一数据源URL:确保application.yml的spring.datasource.url和liquibase.properties的url完全一致,都设为jdbc:h2:mem:AGENCY-SS-PORTAL。
  • 复用Spring数据源:在application.yml中启用Liquibase并复用Spring的数据源配置,删除liquibase.properties里的独立数据源配置(如url、username、password),仅保留变更日志路径等配置。
  • 控制台用正确URL连接:打开H2控制台时,JDBC URL必须填jdbc:h2:mem:AGENCY-SS-PORTAL,才能看到应用创建的表。

2. 指定default-schema时启动失败,表未创建在目标schema

原因

  • Liquibase不会自动创建不存在的schema:设置liquibase.default-schema: AGENCY_SS_REQUEST时,若该schema未提前创建,启动就会抛出“Schema not found”错误。
  • 变更日志未指定schema:Liquibase变更集里创建表时未绑定目标schema,导致表默认创建到H2的默认schema(如PUBLIC)。
  • 实体类未绑定schema:SSRequest实体类的@Table注解未指定schema = "AGENCY_SS_REQUEST",即使Liquibase创建了schema,JPA也会往默认schema写数据。

解决方案

  • 提前创建schema:在Liquibase主变更日志(MASTER_changeset.xml)最开头添加创建schema的变更集:
    <changeSet id="create-schema" author="your-name">
        <createSchema schemaName="AGENCY_SS_REQUEST"/>
    </changeSet>
    
    或者在H2的JDBC URL中添加初始化语句,启动时自动创建schema:
    spring:
      datasource:
        url: jdbc:h2:mem:AGENCY-SS-PORTAL;INIT=CREATE SCHEMA IF NOT EXISTS AGENCY_SS_REQUEST
    
  • 绑定schema到变更集:在创建表的变更集(REQUEST_INFO_20210203_01.xml)中,给表指定schema:
    <createTable tableName="REQUEST_INFO" schemaName="AGENCY_SS_REQUEST">
        <!-- 表字段配置 -->
    </createTable>
    
  • 实体类指定schema:修改SSRequest的@Table注解:
    @Table(name = "REQUEST_INFO", schema = "AGENCY_SS_REQUEST")
    public class SSRequest {
        // 实体字段
    }
    

3. 修改用户名为root时,Liquibase报用户名/密码错误

原因

  • Liquibase读取了独立配置:liquibase.properties里的username还是默认的sa,未同步改成root,导致Liquibase用旧用户名连接数据库,和Spring Boot的数据源配置冲突。
  • IntelliJ运行配置覆盖:Run/Debug Configurations里可能设置了环境变量或VM参数(如-Dspring.datasource.username=sa),覆盖了配置文件里的root设置。
  • 数据源配置不一致:Spring Boot的spring.datasource.username设为root,但Liquibase未复用该配置,而是使用了独立的配置项。

解决方案

  • 同步Liquibase配置:把liquibase.properties里的username改成root,和application.yml的spring.datasource.username保持一致。
  • 复用Spring数据源:删除liquibase.properties里的username、password、url配置,让Liquibase直接使用Spring Boot的数据源,在application.yml中配置:
    liquibase:
      enabled: true
      change-log: classpath:/db/changelog/MASTER_changeset.xml
      default-schema: AGENCY_SS_REQUEST
    
  • 检查IntelliJ运行配置:打开Run/Debug Configurations,查看Environment variables和VM options里有没有硬编码的用户名配置,如有则删除。

内容的提问来源于stack exchange,提问作者Sharvari Nagesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 14:30:40