SBT中排除存在漏洞的log4j 1.2.17传递依赖方法咨询
替换Log4j 1.2.17为2.17.0的解决方案
针对你的SBT 0.13.11 + Play框架应用,要彻底替换存在漏洞的Log4j 1.2.17,需要完成以下几步:
1. 全局排除Log4j 1.x与Play默认Logback依赖
在build.sbt中添加全局排除规则,彻底移除旧版Log4j和Play自带的Logback(避免日志框架冲突):
// 全局排除所有Log4j 1.x依赖 excludeDependencies += ExclusionRule(organization = "log4j", name = "log4j") // 移除Play核心依赖中的Logback组件 libraryDependencies ++= Seq(javaJdbc, cache, javaWs, filters).map( _.exclude("ch.qos.logback", "logback-classic") .exclude("ch.qos.logback", "logback-core") )
2. 添加Log4j 2.17.0核心依赖与桥接包
引入Log4j2的核心组件,同时添加适配旧代码和Play日志体系的桥接包,确保原有日志代码无需修改即可运行:
libraryDependencies ++= Seq( // Log4j2核心API与实现 "org.apache.logging.log4j" % "log4j-api" % "2.17.0", "org.apache.logging.log4j" % "log4j-core" % "2.17.0", // 桥接Log4j 1.x API到Log4j2(兼容旧代码中的Log4j1调用) "org.apache.logging.log4j" % "log4j-1.2-api" % "2.17.0", // 桥接SLF4J到Log4j2(适配Play默认的SLF4J日志接口) "org.apache.logging.log4j" % "log4j-slf4j-impl" % "2.17.0" )
3. 强制覆盖依赖版本(杜绝遗漏)
通过dependencyOverrides强制确保所有传递依赖中不会出现旧版Log4j:
dependencyOverrides += "log4j" % "log4j" % "2.17.0" dependencyOverrides ++= Seq( "org.apache.logging.log4j" % "log4j-api" % "2.17.0", "org.apache.logging.log4j" % "log4j-core" % "2.17.0" )
4. 添加Log4j2配置文件
在项目conf目录下创建log4j2.xml(替换原有的logback.xml),配置日志输出格式与目标:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> <!-- 适配Play框架日志分类 --> <Logger name="play" level="info"/> <Logger name="application" level="info"/> </Loggers> </Configuration>
5. 配置Play使用Log4j2
在conf/application.conf中添加配置,指定Play使用Log4j2作为日志实现:
# 指定Log4j2为日志工厂 logger.factory="org.apache.logging.log4j.jul.LogManagerFactory" play.logger="org.apache.logging.log4j.slf4j.Log4jLoggerFactory"
验证替换结果
执行SBT命令检查依赖树,确认Log4j 1.2.17已被完全替换:
sbt dependencyTree | grep log4j
输出应仅包含org.apache.logging.log4j相关的2.17.0版本依赖,无log4j:log4j:1.2.17条目。
内容的提问来源于stack exchange,提问作者Krishna Kumar
相关产品推荐
相关产品推荐

