如何解决Gradle Scala Plugin编译报错‘jvm-1.11’不是有效-target选项问题
解决Scala编译报错:'jvm-1.11' is not a valid choice for '-target'
问题根源
你使用的Scala版本是2.10.4,这个版本的Scala编译器仅支持最高-target:jvm-1.8的目标参数,但Gradle因配置了Java 11工具链,会自动将JVM版本11传递给ScalaCompile任务,导致传入了不被支持的-target:jvm-1.11,从而触发编译失败。
可行解决方案
方案1:强制指定Scala编译的目标JVM版本(无需修改Java工具链)
直接在Gradle配置中为ScalaCompile任务添加编译器参数,覆盖默认的target设置:
tasks.withType(ScalaCompile) { scalaCompileOptions.additionalParameters = ["-target:jvm-1.8"] }
如果担心Gradle自动添加的参数冲突,可以用更严谨的方式过滤后添加:
tasks.withType(ScalaCompile) { doFirst { // 移除原有-target参数,再添加指定的jvm-1.8 def filteredParams = scalaCompileOptions.additionalParameters.findAll { !it.startsWith("-target:") } scalaCompileOptions.additionalParameters = filteredParams + ["-target:jvm-1.8"] } }
这样配置后,Scala代码会编译为JVM 1.8兼容的字节码,而Java代码仍可使用JVM 11编译,两者能在JVM 11环境下正常运行(JVM向下兼容)。
方案2:升级Scala版本(备选)
如果项目依赖允许,将Scala版本升级到2.12或更高版本(Scala 2.12及以上支持JVM 8+,包括11),修改依赖配置:
dependencies { implementation 'org.scala-lang:scala-library:2.12.17' // 或其他兼容的高版本 }
升级后Gradle的Java 11工具链配置可正常配合Scala编译,无需额外修改参数。
为什么之前的配置无效?
Gradle 7.x中,ScalaCompileOptions的sourceCompatibility和targetCompatibility并不会直接覆盖Gradle根据Java工具链自动生成的编译器参数,因此需要通过additionalParameters直接指定Scala编译器的参数才能生效。
内容的提问来源于stack exchange,提问作者Eric Kolotyluk
相关产品推荐
相关产品推荐

