JDK 兼容性

语言

Scala 的主要平台是 Java 虚拟机 (JVM)。(其他受支持的平台:Scala.jsScala Native。)

有时,新的 JVM 和 JDK(Java 开发工具包)版本要求我们更新 Scala 以保持兼容性。

Scala 兼容性表

最低 Scala 版本

JDK 3 2.13 2.12 2.11
22 (ea) 3.3.4* 2.13.12 2.12.19  
21 (LTS) 3.3.1 2.13.11 2.12.18  
17 (LTS) 3.0.0 2.13.6 2.12.15  
11 (LTS) 3.0.0 2.13.0 2.12.4 2.11.12
8 (LTS) 3.0.0 2.13.0 2.12.0 2.11.0

* = 即将推出;夜间构建中提供支持

即使未将版本组合列为受支持的版本,大多数功能可能仍能正常工作。

始终建议使用 Scala 的最新补丁版本。

Lightbend 为 Scala 2 提供 商业支持。链接的页面包含有关受支持和推荐版本的信息的联系方式。

构建工具兼容性表

最低工作版本

JDK sbt mill
21 (LTS) 1.9.0 0.11.5
17 (LTS) 1.6.0 0.7.0
11 (LTS) 1.1.0 0.1.5
8 (LTS) 1.0.0 0.1.0

即使未将版本组合列为受支持的版本,大多数功能可能仍能正常工作。

使用其他构建工具,例如 Gradle 或 Maven?我们邀请提交拉取请求,将其他列添加到此表中。

运行与编译

JDK 8、11、17 和 21 都是用于编译运行 Scala 代码的合理选择。

由于 JVM 通常向后兼容,因此通常可以安全地使用比编译时更新的 JVM 来运行代码,尤其是如果您不使用指定为“实验性”或“不安全”的 JVM 功能时。

截至 2023 年,一些商店仍在使用 JDK 8,但使用量正在下降,并且一些项目正在放弃支持。如果您在 JDK 11+ 上编译,但希望允许您的用户继续使用 8,则需要格外小心,以避免使用 8 中不存在的 API 和功能。(出于此原因,一些 Scala 开发人员在日常工作中使用较新的 JDK,但在 JDK 8 上进行发布构建。)

长期支持 (LTS) 版本

在 Java 8 之后,Oracle 引入了 JDK 的 LTS 版本概念。这些版本将得到(Oracle 以及生态系统中的其他部分,包括 Scala)比中间版本更长时间的支持。请参阅 https://www.oracle.com/technetwork/java/eol-135779.html

JDK 8、11、17 和 21 是 LTS 版本。(下一个 LTS 版本将是 25。)

Scala 提供了在非 LTS 版本的 JDK 上运行 Scala 编译器的实验性支持。当前的 LTS 版本通常在我们的 CI 矩阵和 Scala 社区构建中进行测试。我们也可能测试非 LTS 版本,但发现的任何问题都被视为优先级较低,并且不会被视为发布阻碍因素。(Lightbend 可能能够在商业支持下更快地解决此类问题。)

如前所述,在 JDK 8 上编译的 Scala 代码应该可以在较新的 JVM 中毫无问题地运行。对于破坏此属性的 bug,我们将给予更高的优先级。(例如,在 2.13.x 中,我们最终可能会提供对 JPMS 模块访问检查的支持,以确保你的代码不会因模块访问冲突而产生 LinkageErrors。)

JDK 供应商和发行版

在几乎所有情况下,你都可以自由使用你选择的 JDK 和 JVM。

JDK 8 用户通常使用 Oracle JDK 或 OpenJDK 的某些版本。

大多数 JDK 11+ 用户正在使用 OpenJDK 或在 OpenJDK 上下文中运行的 GraalVM。GraalVM 在 Scala 基准测试中表现良好,并且受益于 GraalVM 运行时,运行速度也更快。

OpenJDK 有不同的版本,由不同的提供商提供。我们主要使用 Temurin 构建和测试 Scala,但差异不太可能对大多数用户造成影响。

JDK 11 兼容性说明

Scala 测试套件和 Scala 社区构建在 JDK 11 上是绿色的。

一般来说,Scala 可以在 JDK 11+(包括 GraalVM)上运行,但可能不会特别利用 JDK 8 之后添加的功能。

例如,Scala 编译器不会强制执行 Java 平台模块系统的限制,这意味着类型检查的代码在运行时可能会产生链接错误。Scala 2.13.x 最终将为此提供 基本支持(可能仅在基于 JDK 11 构建的夜间版中)。

要跟踪 Scala 中与 JDK 11 相关的问题的进度,请关注

JDK 17 兼容性说明

JDK 17 是 LTS 版本。

Scala 2.13.6+ 和 2.12.15+ 支持 JDK 17。

Scala 测试套件和 Scala 社区构建在 JDK 17 上是绿色的。

对于 sbt 用户,sbt 1.6.0-RC1 是第一个支持 JDK 17 的版本,但实际上 sbt 1.5.5 也可能有效。(它将在启动时打印有关 TrapExit 的警告,你可以忽略它。)

对于可能的 Scala 问题,请参阅 Scala 2 缺陷跟踪器中的 jdk11jdk17 标签。

JDK 21 兼容性说明

JDK 21 是 LTS 版本。

Scala 3.3.1+、2.13.11+ 和 2.12.18+ 支持 JDK 21。

Scala 测试套件和 Scala 2.13 社区构建在 JDK 21 上是绿色的。

对于 sbt 用户,sbt 1.9.0 是第一个支持 JDK 21 的版本。

对于可能的 Scala 问题,请参阅 Scala 2 缺陷跟踪器中的 jdk11jdk17jdk21 标签。

JDK 22 兼容性说明

JDK 22 的早期访问版本可用。JDK 22 将是非 LTS。

对 JDK 22 的初始支持已合并,现已在 Scala 2.13.12 和 2.12.19 中提供。

我们正在努力将 JDK 22 支持添加到 3.3.x 发布系列中。(支持可能在夜间构建中提供。)

GraalVM Native Image 兼容性说明

有几条记录成功地将 Scala 与 GraalVM Native Image(即提前编译器)一起使用,以生成可直接执行的二进制文件。请注意,即使仅使用 Scala 标准库,Native Image 编译在 反射访问 方面也有一些繁重的要求,并且很可能需要执行额外的配置步骤。

一些 sbt 插件为 GraalVM Native Image 编译提供支持

Scala 3

Scala 3.x 系列支持 JDK 8,以及 11 及更高版本。

随着 Scala 和 JVM 的不断发展,一些最终的 Scala 版本可能会放弃对 JDK 8 的支持,以便更好地利用新的 JVM 特性。目前还不清楚新的最低支持版本可能是什么。

此页面贡献者