Scala 2项目迁移Scala 3后定义enum报E103错误如何解决
问题原因
这个报错的核心原因是实际执行编译任务的是Scala 2.x版本编译器。Scala 2没有定义enum关键字,识别不了Scala3的枚举语法,才会抛出「非法顶层定义开头」的E103错误。你在sbt交互窗口执行scalaVersion看到3.1.2,仅代表这个配置项的当前赋值是3.1.2,不代表编译环节真的加载了对应版本的Scala3编译器,本质是旧项目迁移时残留的配置打乱了正常的编译链路。
修复步骤
按以下顺序逐一排查,基本都能解决问题:
- 检查sbt版本
打开project/build.properties文件,确认sbt版本≥1.5.0——Scala3的编译支持是从sbt 1.5.0才开始原生提供的,低版本sbt即使配置了scalaVersion为3.x,也会调用Scala2编译器。如果版本不符合要求,直接把文件内容改成:
修改后重启sbt执行sbt.version=1.7.1reload重载配置。 - 清理build.sbt里残留的Scala2专属配置
打开build.sbt删除以下无效/冲突配置:dependencyOverrides里强制指定Scala2标准库的条目,比如"org.scala-lang" % "scala-library" % "2.13.x"这类依赖覆盖规则- Scala2专属的编译参数:比如
-Ymacro-annotations、旧版本的-Xsource:2.13、-Ypartial-unification等Scala3已经废弃或默认支持的参数 - 仅支持Scala2的编译器插件:比如旧版的macro paradise插件、适配Scala2的kind-projector插件,这类插件会强制sbt切换到Scala2编译链路
- 手动指定
scalaBinaryVersion := "2.13"的配置,纯Scala3项目不需要手动设置这个值,sbt会自动从scalaVersion推导
- 检查多模块配置覆盖
如果是多模块项目,逐个检查子项目的配置块,确认没有子项目单独设置scalaVersion := "2.13.x"覆盖全局的Scala3版本配置。 - 清理缓存重新编译
执行以下命令彻底清理旧的编译缓存和依赖缓存,避免残留的Scala2编译产物干扰:sbt clean rm -rf ~/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/ sbt compile
验证方式
编译前先在sbt shell执行show scalaInstance,查看输出的Scala版本号是否为3.1.2,依赖路径是否指向scala3-library_3的对应jar包。如果输出里仍然出现scala-library-2.13.x的路径,说明还有未清理的依赖或插件在强制拉取Scala2环境,逐一排除插件依赖即可。
内容的提问来源于stack exchange,提问作者user833970
相关产品推荐
相关产品推荐

