什么是Scala运行时,二进制兼容性以及如何部署Scala应用程序?

时间:2017-10-11 10:06:01

标签: scala jvm

实际上这是三个问题,但对我而言,它们紧密相连。

  • 什么是Scala运行时?它只是一个常规JVM和java-lang库的类路径吗?我可以在普通的JVM上运行Scala应用程序吗?我是否应该始终将scala-lang.jar与我自己的代码一起部署?

  • binary compatibility 来自哪里?这个问题的答案通常听起来像是:

  

不同的Scala编译器生成不同的字节码。

但这对我来说并不多。这是否意味着字节码的“接口”发生了变化?例如,更改包含伴随对象实例的字段的名称。如果是,那为什么没有向后兼容性?是不是可以在字节码中添加元数据? Scala编译器可以使用它来改变其行为/期望,并为各种版本发出不同的字节码。

  • 为多个Scala版本编译库是否意味着使用Java库需要为每个版本进行自己的互操作?

2 个答案:

答案 0 :(得分:3)

什么是Scala运行时?

是的,Scala运行时在JVM之上运行,它所需要的只是支持scala-lang.jar库和"简单的"适当版本的JVM。 Scala代码被编译为JVM字节码。您可以更多地了解Scala编译器执行的操作here,或者您可以检查编译phases

是的,当您想在JVM上运行Scala代码时,您应始终提供scala-lang.jar,但运行Scala代码并不是必需的JVM。像Scala native这样的项目允许您在没有JVM的平台上本机运行Scala代码,或Scala.js允许您在JavaScript引擎的顶部运行它。

二进制(in-)兼容性来自哪里?

此(in-)兼容性来自(不仅)Scala标准库的ABI更改(请参阅ABI versioning)。已经提出了改进后向二进制兼容性的建议。查看详细信息here

答案 1 :(得分:1)

Scala编译实际上是将Scala源代码转换为Java 字节码并包含 scala-library

因此,在纯 JVM 中部署 Scala 时,需要像其他依赖项一样包含 scala-library.jar

对于二进制兼容性,这意味着 Scala 2.12.2 二进制兼容 Scala 2.12.1 ,和项目是用 Scala 2.12.1 编译的,你不需要用 Scala 2.12.2 重新编译项目,它可以直接用 Scala 2.12运行.2 库。并且它意味着如果项目具有在 Scala 2.12.1 中编译的依赖项,则可以在 Scala 2.12.2 中安全地使用它。

参考:http://docs.scala-lang.org/overviews/core/binary-compatibility-of-scala-releases.html