You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 12:06:02