Scala 的主要平台是 Java 虚拟机 (JVM)。(其他受支持的平台:Scala.js,Scala 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 11”
- scala/bug 中的 jdk11 标签
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 缺陷跟踪器中的 jdk11 和 jdk17 标签。
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 缺陷跟踪器中的 jdk11、jdk17 和 jdk21 标签。
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 特性。目前还不清楚新的最低支持版本可能是什么。