解决 “Cannot read SQL script from class path resource [sql/XX.sql]“ 错误

这个错误表明你的应用程序无法从类路径(classpath)中找到 sql/init.sql 文件。以下是可能的原因和解决方案

常见原因及解决方案

文件位置不正确

确保你的 init.sql 文件确实位于 src/main/resources/sql/ 目录下(对于 Maven/Gradle 项目)。

检查点:

1.对于 Maven 项目:src/main/resources/sql/init.sql

2.对于 Gradle 项目:src/main/resources/sql/init.sql

资源路径引用错误

确保你使用的路径与实际位置匹配:

复制代码
// 正确的引用方式
new ClassPathResource("sql/init.sql")

如果文件直接在 resources 根目录下,应该使用:

复制代码
new ClassPathResource("init.sql")

构建工具未包含资源文件

检查构建配置:

对于 Maven:

复制代码
<build>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
    </resource>
  </resources>
</build>

对于 Gradle:

复制代码
sourceSets {
  main {
    resources {
      srcDirs = ["src/main/resources"]
    }
  }
}

文件编码问题

确保 SQL 文件使用正确的编码(通常 UTF-8)。

文件权限问题

检查文件是否有读取权限。

调试步骤

验证文件是否存在:

复制代码
ClassPathResource resource = new ClassPathResource("sql/init.sql");
System.out.println("文件存在: " + resource.exists());

列出类路径内容检查:

复制代码
InputStream is = getClass().getResourceAsStream("/sql");
// 或者检查整个类路径

检查构建输出目录,确认文件是否被正确复制:

Maven: target/classes/sql/init.sql

Gradle: build/resources/main/sql/init.sql

替代方案

如果问题仍然存在,可以尝试:

使用绝对路径(不推荐,仅用于测试):
复制代码
new FileSystemResource("src/main/resources/sql/init.sql")
使用 Spring Boot 的自动配置:
复制代码
# application.properties
spring.datasource.schema=classpath:sql/init.sql
相关推荐
洪晓露7 小时前
将 rke2 集群证书延长至 10 年
运维·服务器·数据库
程序猿乐锅8 小时前
【MySQL | 第八篇】MySQL 视图
数据库·mysql
jieyucx9 小时前
SQL 查询终极高阶通鉴:从零基础拆解到工业级多表联查、窗口函数与索引优化
数据库·sql
ai_coder_ai9 小时前
论 NoSQL 数据库技术及其应用
数据库·nosql
AOwhisky11 小时前
Redis 学习笔记(第一期):概述、安装配置与核心理论
运维·数据库·redis·笔记·学习·云计算
ytttr87311 小时前
C# 定时数据库备份工具
开发语言·数据库·c#
睡不醒男孩03082311 小时前
自建 Prometheus+Grafana 与 CLUP 深度监控 PG 集群有什么区别?
数据库·oracle
AOwhisky11 小时前
Redis 学习笔记(第四期):高可用与集群(哨兵 + Cluster + 容器化)
linux·运维·数据库·redis·笔记·学习·缓存
猫猫聚会Ing12 小时前
数据库设计 Prompt 提示词 - 构建与迭代
数据库
上海云盾-小余12 小时前
源站隐藏实战:规避裸 IP 被直接攻击的完整方案
数据库·网络协议·tcp/ip