IntelliJ IDEA sbt shell插件依赖冲突致旧Play项目编译失败求助
旧Play项目sbt编译因spray-json版本冲突失败
问题场景
使用旧版本依赖的Play项目,在IntelliJ IDEA的sbt shell执行compile任务时失败,核心报错为NoSuchMethodError,根源是spray-json版本冲突:全局sbt插件引入的1.3.6版本覆盖了项目依赖的1.2.6版本,而1.3.6中移除了LESS编译所需的JsonParser$.apply(String)方法。
编译报错信息
java.lang.NoSuchMethodError: spray.json.JsonParser$.apply(Ljava/lang/String;)Lspray/json/JsValue; at com.typesafe.sbt.jse.SbtJsTask$$anonfun$com$typesafe$sbt$jse$SbtJsTask$$executeJsOnEngine$1$$anonfun$4.apply(SbtJsTask.scala:190) at com.typesafe.sbt.jse.SbtJsTask$$anonfun$com$typesafe$sbt$jse$SbtJsTask$$executeJsOnEngine$1$$anonfun$4.apply(SbtJsTask.scala:181)
依赖冲突警告
[warn] * io.spray:spray-json_2.10:1.3.6 is selected over 1.2.6 [warn] +- org.jetbrains.scala:scala-compiler-indices-protocol_2.10:1.0.14 (depends on 1.3.6)
全局插件背景
IntelliJ加载了~/.sbt/0.13/plugins目录下的全局插件,其中idea.sbt配置如下:
if (java.lang.System.getProperty("idea.runid", "false") == "2023.1.0") scala.collection.Seq( resolvers += Resolver.file("Scala Plugin Bundled Repository",file(raw"~/.local/share/JetBrains/IdeaIC2023.2/Scala/repo"))(Resolver.mavenStylePatterns), addSbtPlugin("org.jetbrains.scala" % "sbt-structure-extractor" % "2023.1.0"), addSbtPlugin("org.jetbrains.scala" % "sbt-idea-shell" % "2021.1.0"), addSbtPlugin("org.jetbrains.scala" % "sbt-idea-compiler-indices" % "1.0.14") ) else scala.collection.Seq.empty
解决方案
1. 强制项目依赖版本优先级(推荐)
在项目根目录的build.sbt中添加依赖覆盖规则,强制sbt所有模块(包括全局插件)使用项目需要的spray-json 1.2.6版本:
dependencyOverrides += "io.spray" % "spray-json_2.10" % "1.2.6"
添加后重新执行sbt compile,sbt会优先使用指定版本,解决方法缺失的问题。
2. 隔离全局插件影响
如果不想修改项目配置,可临时为当前项目禁用全局插件:
- 在项目根目录创建
.sbtopts文件,添加以下内容:
该配置仅对当前项目生效,不会影响其他项目的全局插件使用。-Dsbt.global.plugins=disabled
3. 调整全局插件版本(备选)
查询org.jetbrains.scala:sbt-idea-compiler-indices的历史版本,选择一个依赖spray-json 1.2.6的版本替换当前的1.0.14,修改~/.sbt/0.13/plugins/idea.sbt中的插件版本即可。不过此方法需要核对插件依赖树,操作成本较高。
内容的提问来源于stack exchange,提问作者andrey.ladniy
相关产品推荐
相关产品推荐

