具体来说,问题是 Spring Boot 在启动时尝试自动执行 SQL 初始化脚本(init-schema.sql),但项目中没有这个文件。这是 Spring ...

2026年06月22日 12:36 24.72 秒 success

错误信息

具体来说,问题是 Spring Boot 在启动时尝试自动执行 SQL 初始化脚本(init-schema.sql),但项目中没有这个文件。这是 Spring Boot 3.2 的默认行为——它会自动查找并执行 schema.sql 和 data.sql 脚本。 根本原因是之前的 JwtUtils.java 文件被误删了,我恢复了它并添加了配置文件,但没有正确处理 SQL 初始化这块。

AI 解决方案

🔍 错误信息分析

1. 🌐 错误翻译


根据您的描述,核心错误信息可以概括为:
原文:Spring Boot automatically attempts to execute the SQL initialization script (init-schema.sql), but the file does not exist.
译文:Spring Boot 自动尝试执行 SQL 初始化脚本(init-schema.sql),但该文件不存在。

2. 🎯 原因分析


  • 根本原因:Spring Boot 3.2 默认启用 SQL 初始化脚本的自动执行。它会自动查找并尝试运行类路径下的 schema.sqldata.sql 脚本。您描述中提到的 init-schema.sql 可能是项目早期自定义的脚本名称,或者是 spring.sql.init.schema-locations 属性配置指向的文件。

  • 问题发生:当 Spring Boot 启动时,它根据默认配置或 application.properties/yml 中的设置,检测到应执行一个初始化脚本,但在约定的路径下找不到该文件,从而导致启动失败。

  • 上下文:您提到恢复了被误删的 JwtUtils.java 文件,但项目的 sql.init 相关配置可能被更改或丢失。原先项目可能通过配置(如 spring.sql.init.mode=never)禁用了自动SQL初始化,但在恢复过程中未一并恢复此配置,从而导致 Spring Boot 回退到默认的 always 行为。
  • 3. 💡 解决方案


    请在您的 application.propertiesapplication.yml 配置文件中,显式地禁用 Spring Boot 的 SQL 自动初始化功能。

    方案 A:使用 application.properties 文件

    # application.properties
    # 完全禁用 SQL 脚本的自动执行
    spring.sql.init.mode=never
    
    # 如果您只想禁用特定脚本的执行,可以将其位置指向一个不存在的文件或注释掉相关配置
    # spring.sql.init.schema-locations=classpath:non-existent.sql
    # spring.sql.init.data-locations=classpath:non-existent.sql
    

    方案 B:使用 application.yml 文件

    # application.yml
    spring:
      sql:
        init:
          mode: never
    

    方案 C:如果需要该脚本,创建对应的文件
    如果您确实需要执行一个名为 init-schema.sql 的初始化脚本,请在项目的 src/main/resources 目录下创建该文件。

    4. 🛡️ 预防措施


  • 明确初始化策略:对于生产环境和重要项目,建议明确设置 spring.sql.init.mode 属性为 neverembedded(仅针对嵌入式数据库),避免意外执行。

  • 使用专业迁移工具:推荐使用 FlywayLiquibase 等专业的数据库版本管理工具来管理SQL脚本的执行,它们提供了更强大的版本控制、回滚和团队协作能力,比依赖 Spring Boot 的简单自动执行更可靠。