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

Spring Boot 2.4.13升级至2.7.4后Scala 2.12容器化应用自动配置类缺失及SBT插件依赖解析异常问题排查求助

解决Spring Boot 2.7.4升级后自动配置文件缺失的问题

你在升级Spring Boot版本后遇到的核心问题,根源在于Spring Boot 2.7.x将自动配置类的声明从传统的META-INF/spring.factories迁移到了META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,但当前的打包流程(sbt-assembly或自定义配置)没有正确处理这个新文件。结合你尝试过的方案,给你几个更针对性的解决思路:

1. 修复sbt-assembly的合并策略(适配你当前用assembly的场景)

你之前修改的合并策略只匹配了META-INF/spring目录,但没有精准覆盖新的AutoConfiguration.imports文件,且处理方式需要调整——每个Spring Boot starter都会自带这个文件,必须把所有依赖中的内容合并起来,而不是简单过滤或丢弃。调整后的合并策略如下:

lazy val assemblySettings = Seq(
  assembly / assemblyMergeStrategy := {
    // 合并所有依赖中的自动配置导入文件
    case PathList("META-INF", "spring", "org.springframework.boot.autoconfigure.AutoConfiguration.imports") => MergeStrategy.concat
    // 保留旧spring.factories的去重处理(兼容遗留依赖)
    case PathList("META-INF", "spring.factories") => MergeStrategy.filterDistinctLines
    // 处理spring目录下其他自动配置相关文件
    case PathList("META-INF", "spring", xs @ _*) => MergeStrategy.concat
    // 仅丢弃非spring相关的META-INF文件
    case PathList("META-INF", xs @ _*) if !xs.contains("spring") => MergeStrategy.discard
    // 其他文件沿用原有策略
    case _ => MergeStrategy.first
  }
)

修改后重新执行sbt assembly,然后检查打包后的jar中是否存在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,且内容包含所有需要的自动配置类全限定名。

2. 改用官方Spring Boot SBT插件(更推荐的方案)

你之前尝试了错误的插件(maven插件不适用于sbt),官方提供了专门的Spring Boot SBT插件,它会自动处理自动配置文件的打包逻辑,无需手动调整合并策略。操作步骤如下:

第一步:更新plugins.sbt

// 保留正确的native-packager插件
addSbtPlugin("com.github.sbt" % "sbt-native-packager" % "1.9.2")
// 添加官方Spring Boot SBT插件
addSbtPlugin("org.springframework.boot" % "spring-boot-sbt-plugin" % "2.7.4")

第二步:在build.sbt中启用插件

enablePlugins(SpringBootPlugin, JavaAppPackaging)

// 统一Spring Boot版本
val springBootVersion = "2.7.4"
libraryDependencies ++= Seq(
  "org.springframework.boot" % "spring-boot-starter" % springBootVersion,
  // 你的其他业务依赖...
)

执行sbt springBootPackage生成可执行jar,这个产物会自动包含所有必要的自动配置文件,避免手动assembly的配置漏洞。

3. 检查并清理依赖冲突

升级后可能存在旧版本Spring Boot自动配置依赖残留,导致打包时文件被覆盖或丢失:

  • 执行sbt dependencyTree查看依赖树,确认所有spring-boot-autoconfigure的依赖版本均为2.7.4
  • 添加依赖覆盖强制统一版本:
dependencyOverrides += "org.springframework.boot" % "spring-boot-autoconfigure" % "2.7.4"

4. 验证打包产物

无论用哪种打包方式,解压生成的jar文件,检查以下路径是否存在且内容正确:

  • META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports:应包含多行自动配置类的全限定名
  • META-INF/spring.factories:可能仍存在,但仅用于兼容旧依赖

如果这些文件不存在,说明打包过程中未将依赖中的对应文件包含进去,需要重新检查打包插件的配置。

5. 适配Spark部署的特殊情况

由于你的应用通过SparkSubmit启动,Spark的打包机制可能与Spring Boot打包存在冲突:

  • 尝试用Spring Boot插件打包成可执行jar,再通过spark-submit运行(注意调整Spark依赖的范围,避免版本冲突)
  • 如果必须使用Spark的打包方式,确保配置不会排除META-INF/spring目录下的文件

优先推荐使用官方Spring Boot SBT插件,它能帮你处理大部分打包细节,减少手动配置的出错概率。

内容的提问来源于stack exchange,提问作者dhalfageme

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:17:49