SBT Spark项目测试时application.conf配置未被继承问题求助
问题根因
- SBT的Test任务默认不会fork独立JVM进程,你配置的
javaOptions in Test不会注入到运行测试的JVM中,代码读取config.file系统属性为空,实际没有加载到测试专用配置。 - 即便系统属性生效,从文件路径加载
application.test.conf时,内部的include "application.conf"默认从当前工作目录查找配置,不会优先读取类路径下src/main/resources的默认配置,导致基础配置缺失。
解决方案
1. 修复SBT配置确保测试参数生效
在build.sbt中添加Test进程fork配置,让javaOptions生效:
Test / fork := true Test / javaOptions += s"-Dconfig.file=${(Test / sourceDirectory).value}/resources/application.test.conf"
2. 修正测试配置的include规则
修改src/test/resources/application.test.conf的include语句,强制从类路径加载默认配置:
include classpath("application.conf") # 其余原有测试配置不变 env = "test" data { file.name = "housing.tgz" file.target.path = "data/tmp/" }
3. 可选兜底优化
修改配置加载逻辑,加载完指定配置后兜底fallback到默认的类路径配置,避免include失效问题:
def getConfigSource: ConfigSource = { println(s"System get Property ************************ ${System.getProperty("config.file")}") val baseSource = Option(System.getProperty("config.file")) match { case Some(path) if new File(path).exists() => ConfigSource.FromFile(path) case _ => val opt1 = Option(System.getProperty("ENV", "")).filter(_.nonEmpty) val opt2 = Option(System.getProperty("env", "")).filter(_.nonEmpty) opt1.orElse(opt2) match { case Some(envName) => val name = s"application.${envName.toLowerCase}.conf" ConfigSource.FromResource(name) case None => println("Loading default from Resource **************** ") ConfigSource.FromResource("application.conf") } } // 新增兜底回退到默认配置 baseSource.withFallback(ConfigSource.FromResource("application.conf")) }
内容的提问来源于stack exchange,提问作者joesan
相关产品推荐
相关产品推荐

