Scala Spark项目中log4j与slf4j依赖兼容问题求助
问题分析与解决方案
这个NoSuchMethodError是SLF4J与Log4j版本不兼容+缺失绑定桥接包导致的,另外Spark本身自带SLF4J依赖,你手动引入的版本和Spark内置版本冲突,同时缺少负责转发SLF4J日志请求到Log4j2的桥接包,最终引发方法找不到的错误。
1. 修复依赖配置
核心调整点:
- 排除Spark自带的SLF4J依赖,彻底避免版本冲突
- 添加
log4j-slf4j-impl绑定包,打通SLF4J与Log4j2的协作链路 - 移除不必要的
sbt依赖(这是构建工具本身,不需要作为项目依赖引入)
2. 解决sbt dependencyTree无效问题
该命令需要sbt-dependency-tree插件支持,在项目根目录的project/plugins.sbt文件中添加:
addSbtPlugin("net.virtual-void" % "sbt-dependency-tree" % "0.10.0-RC1")
重新加载sbt后,即可正常使用sbt dependencyTree查看依赖树。
完整可运行的build.sbt配置
name := "YourProjectName" version := "1.0" scalaVersion := "2.12.16" scalacOptions ++= Seq("-deprecation") lazy val courseId = settingKey[String]("Course ID") courseId := "e8VseYIYEeWxQQoymFg8zQ" resolvers += Resolver.sonatypeRepo("releases") // Spark依赖:排除自带的slf4j-api,避免版本冲突 libraryDependencies ++= Seq( "org.apache.spark" %% "spark-core" % "3.4.1" exclude ("org.slf4j", "slf4j-api"), "org.apache.spark" %% "spark-sql" % "3.4.1" exclude ("org.slf4j", "slf4j-api"), "org.apache.commons" % "commons-lang3" % "3.12.0", "jline" % "jline" % "2.14.6" ) // 日志依赖:统一版本 + 核心包 + 桥接绑定 libraryDependencies ++= Seq( "org.slf4j" % "slf4j-api" % "1.7.32", "org.apache.logging.log4j" % "log4j-core" % "2.17.1", "org.apache.logging.log4j" % "log4j-slf4j-impl" % "2.17.1" // 关键:SLF4J转Log4j2的绑定桥接 )
额外验证步骤
- 执行
sbt clean compile清理缓存并重新编译项目 - 在IntelliJ中执行
File -> Invalidate Caches...,重启IDE消除缓存残留问题 - 确保
src/main/resources目录下存在log4j2.xml配置文件(基础示例如下):
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
内容的提问来源于stack exchange,提问作者Pepe Diaz
相关产品推荐
相关产品推荐

