Scala 3 是否兼容Maven?使用Maven编译Scala 3报错如何解决
问题原因分析
1. Java文件报错的根源
你当前使用的scala-maven-plugin:4.5.4默认开启了Scala/Java混合编译模式,该模式下Scala编译器会同步解析Java源码以处理两类语言的交叉依赖,而非调用独立的javac编译Java文件。Scala 3编译器对Java语法的容错、解析逻辑和Scala 2.13存在差异,当Scala 3编译器自身先遇到Scala代码的语法兼容问题后,会引发后续Java文件解析的连锁错误,这就是你看到一堆看似不合理的Java语法报错的核心原因。
2. Scala 3编译失败的直接原因
你给出的Scala代码使用的是Scala 2的过程式方法定义语法:
def main(args: Array[String]) { // 方法体 }
Scala 3已经移除了这种无等号的过程语法,要求必须显式写等号声明方法体:
def main(args: Array[String]) = { // 方法体 } // 或者显式标注返回值 def main(args: Array[String]): Unit = { // 方法体 }
这就是报错里提到的'=' expected, but '{' found的根因,这个Scala语法错误触发后,进一步导致了后续Java文件解析的异常报错。
完整解决方案
- 修正
HelloScala.scala的main方法语法,补全方法声明的等号,和Scala 3的语法规范对齐。 - 升级
scala-maven-plugin到最新稳定版,4.5.4版本对Scala 3的支持存在较多已知bug,建议升级到4.8.x及以上版本。 - 如果你的项目中Java和Scala没有交叉依赖,可以在插件配置里指定分开编译模式,避免Scala编译器处理Java文件:
<plugin> <groupId>net.alchim31.maven</groupId> <artifactId>scala-maven-plugin</artifactId> <version>4.8.1</version> <configuration> <scalaVersion>3.3.1</scalaVersion> <compileOrder>JavaThenScala</compileOrder> </configuration> </plugin> - IntelliJ构建异常的话,先在IDEA的项目设置里确认Scala SDK版本已经切换为3.x,同时打开
Build, Execution, Deployment > Build Tools > Maven > Runner,勾选Delegate IDE build/run actions to Maven,避免IDEA自带的构建器和Maven配置不一致导致的冲突。
内容的提问来源于stack exchange,提问作者Eric Kolotyluk
相关产品推荐
相关产品推荐

