如何在Gradle中根据环境切换H2与PostgreSQL依赖?
问题根源
你当前的Gradle配置依赖判断是检查local这个项目属性,但启动命令传的是activeProfile=local,两者不匹配,导致project.hasProperty("local")返回false,H2依赖没被引入,代码中用到H2的WebServer类自然会编译报错。
解决方案
1. 对齐Gradle属性判断与启动参数
修改Gradle脚本,让依赖判断基于activeProfile属性的值,和启动命令保持一致:
def activeProfile = project.findProperty("activeProfile") ?: 'default' dependencies { // 其他依赖保持不变 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'io.projectreactor:reactor-test' // 根据activeProfile引入对应数据库依赖 if (activeProfile == 'local') { implementation 'com.h2database:h2' } else if (activeProfile in ['test', 'prod']) { implementation 'org.postgresql:postgresql' } } bootRun { systemProperty 'spring.profiles.active', activeProfile }
这样执行./gradlew bootRun -PactiveProfile=local时,Gradle会自动引入H2依赖,编译错误就能解决。
2. 代码层面适配环境(避免运行时错误)
如果代码中有H2专属的配置类或代码,记得加上@Profile("local")注解,确保只在local环境下加载:
@Configuration @Profile("local") public class H2WebConfig { @Bean(initMethod = "start", destroyMethod = "stop") public org.h2.server.web.WebServer h2WebServer() { return org.h2.server.web.WebServer.createWebServer( "-web", "-webAllowOthers", "-webPort", "8082" ); } }
3. 打包时指定环境
打测试/生产包时,只需指定对应的activeProfile,Gradle会自动只包含对应数据库依赖:
- 生产包:
./gradlew build -PactiveProfile=prod - 测试包:
./gradlew build -PactiveProfile=test
额外说明
如果不想用activeProfile作为判断依据,也可以直接在启动/打包时传递-Plocal/-Pprod参数,对应修改Gradle中的判断逻辑:
if (project.hasProperty("local")) { implementation 'com.h2database:h2' } else if (project.hasProperty("test") || project.hasProperty("prod")) { implementation 'org.postgresql:postgresql' }
此时启动命令改为./gradlew bootRun -Plocal即可生效。
内容的提问来源于stack exchange,提问作者springbootlearner
相关产品推荐
相关产品推荐

