【已解决】在Spring Boot工程中,若未识别到resources/db文件夹下的SQL文件

在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.propertiesapplication.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.sql
    data: 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.sql
  Resource 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)。

​总结​

核心步骤:

  1. 确认SQL文件在src/main/resources/db/下;

  2. 检查构建工具未排除该目录;

  3. application.properties中显式配置spring.datasource.schema/data路径;

  4. 手动加载时使用classpath:db/xxx.sql前缀。