IntelliJ IDEA 2017.1.4中SBT项目日志无法正常使用问题求助
问题解析与解决方案
我来帮你拆解一下遇到的这两个问题,都是SBT依赖scope和SLF4J绑定机制里的常见坑:
一、初始SBT依赖配置运行出警告,移到lib目录就正常的原因
你在build.sbt里给slf4j-log4j12加了test scope:
libraryDependencies += "org.slf4j" % "slf4j-log4j12" % "1.7.13" % "test"
但你的MyApp是放在main代码目录下(属于compile scope),SBT默认运行main程序时,只会把compile和runtime scope的依赖加入类路径,test scope的依赖是不会被包含的。这就导致SLF4J在运行时找不到对应的logger绑定(slf4j-log4j12是SLF4J到log4j的桥接包),所以控制台会弹出类似"Failed to load class org.slf4j.impl.StaticLoggerBinder"的警告。
而把jar放到lib目录就不一样了——SBT会自动把lib下的所有jar加入到所有scope的类路径里(不管是compile、test还是runtime),所以main运行时能拿到桥接包,自然就正常了。
解决办法:如果你的main代码需要用log4j作为SLF4J的实现,把slf4j-log4j12的scope改成runtime或者直接去掉scope(默认是compile):
libraryDependencies += "org.slf4j" % "slf4j-log4j12" % "1.7.13" % "runtime"
二、添加logback-classic Test依赖后,IDEA加载不了slf4j-api的原因
这个问题核心是依赖冲突+SLF4J绑定机制限制:
logback-classic本身已经依赖了slf4j-api,logback 1.2.3对应的slf4j-api版本是1.7.25左右,这和你显式声明的slf4j-api 1.7.13产生了版本冲突。SBT在解析依赖时,可能会因为冲突自动排除其中一个版本,而IDEA的SBT导入器可能因此出现错误,导致slf4j-api无法正常加载。- 另外,你在
testscope下同时存在两个SLF4J绑定包:slf4j-log4j12和logback-classic。SLF4J不允许同时存在多个绑定实现,这种冲突也会干扰IDEA对依赖的解析。
解决办法:
- 去掉显式的
slf4j-api依赖,让logback-classic或者slf4j-log4j12自动传递引入对应的slf4j-api版本,避免版本冲突。 - 确保同一个scope下只有一个SLF4J绑定包:
- 如果想让main环境用log4j,test环境用logback,就把
slf4j-log4j12的scope设为runtime,只给main环境用:libraryDependencies += "log4j" % "log4j" % "1.2.17" libraryDependencies += "org.slf4j" % "slf4j-log4j12" % "1.7.13" % "runtime" libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.2.3" % Test - 或者如果test环境不需要
slf4j-log4j12,可以在添加logback依赖时排除它:libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.2.3" % Test excludeAll( ExclusionRule(organization = "org.slf4j", name = "slf4j-log4j12") )
- 如果想让main环境用log4j,test环境用logback,就把
- 最后在IDEA里执行
File -> Sync Project with SBT Files,刷新依赖,让IDEA重新解析正确的依赖树。
内容的提问来源于stack exchange,提问作者xyz
相关产品推荐
相关产品推荐

