在Spring Boot工程中,若未识别到resources/db
文件夹下的SQL文件,通常与资源路径配置、构建工具设置或代码加载方式有关。以下是逐步排查和解决方案:
1. 确认SQL文件存放路径
Spring Boot默认从类路径(classpath:
)加载资源,标准资源目录为src/main/resources
。确保SQL文件存放于:
src/main/resources/db/
编译后,文件应被复制到输出目录的classes/db/
下(如Maven的target/classes/db/
或Gradle的build/classes/java/main/db/
)。
2. 检查构建工具资源配置
构建工具(Maven/Gradle)可能因自定义配置排除了db
目录,导致文件未被打包。
Maven项目
检查pom.xml
中的<resources>
配置,确保未排除db
目录:
<build><resources><resource><directory>src/main/resources</directory><!-- 确保没有排除db目录 --><!-- <excludes><exclude>db/**</exclude></excludes> --> </resource></resources>
</build>
Gradle项目
检查build.gradle
中的sourceSets
配置,确保包含db
目录:
sourceSets {main {resources {srcDirs = ['src/main/resources']// 确保包含db目录(默认已包含,无需额外配置)}}
}
3. 显式配置SQL文件路径(关键)
若通过Spring Boot自动初始化数据库(如schema.sql
/data.sql
),需在application.properties
或application.yml
中显式指定路径(默认仅加载根路径的schema.sql
/data.sql
)。
示例配置:
# application.properties
# 加载db目录下的schema.sql(建表语句)
spring.datasource.schema=classpath:db/schema.sql
# 加载db目录下的data.sql(插入数据)
spring.datasource.data=classpath:db/data.sql
# application.yml
spring:datasource:schema: classpath:db/schema.sqldata: classpath:db/data.sql
4. 其他场景:手动加载SQL文件
若在代码中手动加载(如通过JdbcTemplate
或@Sql
注解),需使用正确的类路径前缀。
示例1:通过@Sql
注解(测试场景)
@SpringBootTest
@Sql(scripts = "classpath:db/init-test.sql") // 指向db目录下的init-test.sql
public class MyServiceTest {// ...
}
示例2:通过JdbcTemplate
执行
@Autowired
private JdbcTemplate jdbcTemplate;public void init() {// 读取db目录下的script.sqlResource resource = new ClassPathResource("db/script.sql");String sql = new String(resource.getInputStream().readAllBytes());jdbcTemplate.execute(sql);
}
5. 验证文件是否被正确打包
构建项目后,检查输出目录(如target/classes/db/
)是否存在SQL文件:
Maven:执行
mvn clean package
,查看target/classes/db/
。Gradle:执行
gradle clean build
,查看build/classes/java/main/db/
。
6. 其他注意事项
数据库方言与初始化顺序:若使用Hibernate,确保
spring.jpa.hibernate.ddl-auto=none
(避免Hibernate自动生成DDL覆盖schema.sql
)。外部配置覆盖:若通过
--spring.config.location
指定外部配置,需确认配置中包含spring.datasource.schema
路径。IDE缓存问题:重启IDE或清理缓存(如IntelliJ的
File > Invalidate Caches
)。
总结
核心步骤:
确认SQL文件在
src/main/resources/db/
下;检查构建工具未排除该目录;
在
application.properties
中显式配置spring.datasource.schema/data
路径;手动加载时使用
classpath:db/xxx.sql
前缀。