Spring Boot 2.4.13升级至2.7.4后Scala 2.12容器化应用自动配置类缺失及SBT插件依赖解析异常问题排查求助
你在升级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

