Spring Boot如何指定从test/resources加载H2数据库schema文件?
我懂你的困扰:为了让Maven打包时排除schema-h2.sql,你把它移到了src/test/resources,结果本地启动主应用时却找不到这个文件了。核心原因很简单——主应用的运行上下文默认只会加载src/main/resources下的资源,src/test/resources是专门给测试代码准备的,不会被主应用的类路径包含。
下面给你几个实用的解决方案,按推荐程度排序:
方案一:留在main/resources,用Maven打包时排除(最推荐)
其实不用把文件移到test目录,直接通过Maven的资源配置在打包时排除它就行,这样本地开发时主应用和测试都能正常访问,打包后也不会包含这个文件。
在你的pom.xml里添加如下配置:
<build> <resources> <!-- 配置主资源目录,排除schema-h2.sql --> <resource> <directory>src/main/resources</directory> <excludes> <exclude>schema-h2.sql</exclude> </excludes> </resource> <!-- 确保其他资源正常加载 --> <resource> <directory>src/main/resources</directory> <includes> <include>**/*</include> </includes> <excludes> <exclude>schema-h2.sql</exclude> </excludes> </resource> </resources> </build>
这样配置后,本地运行主应用或测试时,schema-h2.sql都在类路径里能正常加载;执行mvn package时,这个文件会被排除在最终的jar/war包之外,完美契合你的需求。
方案二:用Spring Profile指定文件路径(适合必须放test目录的场景)
如果你一定要把schema-h2.sql放在src/test/resources,可以通过Spring Profile来配置本地开发环境的数据源初始化路径,让主应用启动时能找到这个文件。
- 在
src/main/resources下创建application-dev.properties,添加配置:
# 指定schema文件的本地路径(仅本地开发时生效) spring.datasource.schema=file:src/test/resources/schema-h2.sql
- 本地启动主应用时,激活
devprofile:- IDE启动时,添加VM参数:
-Dspring.profiles.active=dev - 命令行启动:
java -jar your-app.jar --spring.profiles.active=dev
- IDE启动时,添加VM参数:
这样,本地开发时主应用会加载test目录下的schema文件,生产环境默认不激活dev profile,也就不会尝试加载这个文件,打包时test目录的文件也不会被包含进去。
方案三:通过Maven资源插件复制文件到主类路径(稍复杂)
可以配置Maven的资源插件,在本地编译时把src/test/resources下的schema-h2.sql复制到target/classes目录(主应用的类路径),这样主应用就能访问到了,同时打包时不包含这个文件。
在pom.xml里添加:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.1</version> <executions> <execution> <id>copy-test-schema</id> <!-- 只在编译阶段执行,打包阶段跳过 --> <phase>compile</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${project.build.outputDirectory}</outputDirectory> <resources> <resource> <directory>src/test/resources</directory> <includes> <include>schema-h2.sql</include> </includes> </resource> </resources> </configuration> </execution> </executions> </plugin> </plugins> </build>
这个方案不用修改Spring配置,但需要维护Maven插件的配置,适合对Maven配置比较熟悉的场景。
最后提个醒:如果你的主应用要部署到生产环境,生产环境肯定用真实的Oracle数据库,根本不需要schema-h2.sql,上面的方案都能满足你「打包排除、本地可用」的需求。
内容的提问来源于stack exchange,提问作者Phate

