设置pact.logLevel启动sbt触发类型转换异常求助
问题
执行命令sbt -Dpact.logLevel=DEBUG启动sbt时触发类型转换异常,错误日志如下:
[error] (pactVerify) java.lang.ClassCastException: class org.apache.logging.slf4j.Log4jLogger cannot be cast to class ch.qos.logback.classic.Logger (org.apache.logging.slf4j.Log4jLogger is in unnamed module of loader sbt.internal.MetaBuildLoader @2641e737; ch.qos.logback.classic.Logger is in unnamed module of loader sbt.internal.PluginManagement$PluginClassLoader @ee2ae9a) [error] at au.com.dius.pact.provider.sbt.SbtProviderPlugin$autoImport$.$anonfun$pactProvidersConfig$2(SbtProviderPlugin.scala:26) [error] at au.com.dius.pact.provider.sbt.SbtProviderPlugin$autoImport$.$anonfun$pactProvidersConfig$2$adapted(SbtProviderPlugin.scala:22) [error] at scala.Function1.$anonfun$compose$1(Function1.scala:49) [error] at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:63) [error] at sbt.std.Transform$$anon$4.work(Transform.scala:69) [error] at sbt.Execute.$anonfun$submit$2(Execute.scala:283) [error] at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:24) [error] at sbt.Execute.work(Execute.scala:292) [error] at sbt.Execute.$anonfun$submit$1(Execute.scala:283) [error] at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:265) [error] at sbt.CompletionService$$anon$2.call(CompletionService.scala:65) [error] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) [error] at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) [error] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) [error] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) [error] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [error] at java.base/java.lang.Thread.run(Thread.java:840)
问题源于pact插件依赖log4j日志实现,但项目本身使用logback(build.sbt已引入logback依赖),需要解决日志级别设置的冲突问题。
当前project/plugins.sbt配置:
libraryDependencySchemes += "org.scala-lang.modules" %% "scala-xml" % VersionScheme.Always addSbtPlugin("au.com.dius" %% "pact-jvm-provider-sbt" % "3.5.12")
(添加依赖方案是为了解决pact插件引入后的org.scala-lang.modules:scala-xml_2.12版本冲突)
解决方案
1. 排除pact插件的log4j依赖,统一使用logback
修改project/plugins.sbt,在引入pact插件时排除所有log4j相关依赖:
libraryDependencySchemes += "org.scala-lang.modules" %% "scala-xml" % VersionScheme.Always addSbtPlugin("au.com.dius" %% "pact-jvm-provider-sbt" % "3.5.12") excludeAll( ExclusionRule(organization = "org.apache.logging.log4j"), ExclusionRule(organization = "log4j") )
随后通过logback配置文件(如src/main/resources/logback.xml)设置pact相关包的日志级别:
<configuration> <!-- 保留项目原有logback配置 --> <logger name="au.com.dius.pact" level="DEBUG" /> </configuration>
2. 利用sbt自身日志系统传递级别
跳过-Dpact.logLevel=DEBUG参数,直接通过sbt的日志参数控制:
- 指定自定义logback配置文件启动:
sbt -Dlogback.configurationFile=src/main/resources/logback.xml pactVerify - 或直接设置全局DEBUG级别(会影响所有日志输出):
sbt -Dlogger.debug=true pactVerify
3. 升级pact插件版本
旧版本的pact-jvm-provider-sbt可能存在日志依赖兼容性问题,尝试升级到4.x系列的稳定版本,新版本通常会优化日志依赖管理,减少此类冲突。修改project/plugins.sbt:
libraryDependencySchemes += "org.scala-lang.modules" %% "scala-xml" % VersionScheme.Always addSbtPlugin("au.com.dius" %% "pact-jvm-provider-sbt" % "4.6.0")
升级后可按新版本文档尝试使用-Dpact.logLevel=DEBUG参数,或通过其推荐的方式配置日志级别。
内容的提问来源于stack exchange,提问作者Troy Daniels




