Scala 3项目中scalac编译标志重复设置问题排查
解决Scala 3项目中sbt-tpolecat与自定义本地插件重复设置scalacOptions的问题
第一步:精准定位重复参数的来源
sbt自带参数溯源命令,能直接看到每个scalacOptions的归属:
sbt "show compile:scalacOptions::origin"
执行后会输出每个编译参数的来源,比如哪一行来自自定义插件、哪一行来自sbt-tpolecat,快速锁定重复根源。
同时直接检查自定义插件代码:
- 查找是否硬编码添加了
-deprecation、-unchecked、-encoding UTF-8这些参数 - 确认插件有没有针对Scala 3做版本判断——sbt-tpolecat会根据Scala版本自动适配参数,自定义插件如果没做版本区分,很容易在Scala 3环境下重复设置
第二步:针对性解决重复问题
根据定位结果,选以下一种方案解决:
方法1:修改自定义插件,避免重复设置
如果自定义插件可控,直接移除重复参数,或者改成仅在参数未被设置时才添加:
// 在自定义插件的配置中替换原有硬编码的参数设置 scalacOptions ++= { val deprecationOpt = if (!scalacOptions.value.contains("-deprecation")) Seq("-deprecation") else Seq.empty val uncheckedOpt = if (!scalacOptions.value.contains("-unchecked")) Seq("-unchecked") else Seq.empty val encodingOpts = if (!scalacOptions.value.contains("-encoding") && !scalacOptions.value.contains("UTF-8")) Seq("-encoding", "UTF-8") else Seq.empty deprecationOpt ++ uncheckedOpt ++ encodingOpts }
如果插件用于共享通用配置,更优雅的方式是让它依赖sbt-tpolecat,只添加tpolecat未覆盖的自定义参数。
方法2:在项目中排除tpolecat的重复参数
如果不想修改自定义插件,可在项目build.sbt中过滤掉tpolecat添加的重复参数:
// 移除重复的编译参数 scalacOptions ~= { opts => opts.filterNot(opt => opt == "-deprecation" || opt == "-unchecked" || opt == "-encoding" || opt == "UTF-8" ) }
若你的tpolecat版本支持专属排除配置,也可以用:
tpolecatExcludeOptions ++= Seq("-deprecation", "-unchecked", "-encoding")
第三步:验证修复效果
执行以下命令确认重复参数已被移除:
sbt "show compile:scalacOptions"
确认参数无重复后,重新编译项目即可消除错误。
内容的提问来源于stack exchange,提问作者joesan
相关产品推荐
相关产品推荐

