You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

设置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

火山引擎 最新活动