Scala 入门包

最后更新: 2024-01-11 06:19:43 +0800 +0800
tags: Jvm | Scala | Sbt
原文以英文撰写。您正在阅读AI翻译版本。

Scala 编译为 JVM 字节码。构建时需要 Scala 编译器,应用运行时类路径中需要 Scala 标准库。 Scala 二进制版本是兼容性边界:以 _2.13 结尾的工件不能与对应的 _3 工件互换。

版本与工具链 #

Scala 2 和 Scala 3 使用不同的编译器和语言规则。对于每个交叉发布的库,都使用项目选定的二进制版本。Java 运行时必须满足 Scala 版本记录的 JDK 要求;使用部署时采用的 JDK 进行编译和测试。

For a small program:

sh
scala-cli run Main.scala
scala-cli test .

Scala CLI 为面向源代码的项目管理编译器和依赖解析。对于需要维护的应用,应提交构建定义,而不要依赖开发者本地的命令历史。

sbt #

sbt 是 Scala 的构建工具。启动器在 JVM 上启动,并下载项目声明的 sbt 版本。在 project/build.properties 中固定 sbt 版本,并只定义一次 Scala 版本:

scala
ThisBuild / scalaVersion := "3.5.2"
ThisBuild / organization := "com.example"

lazy val root = (project in file("."))
  .settings(
    name := "orders",
    libraryDependencies += "org.typelevel" %% "cats-core" % "2.12.0"
  )

在项目根目录运行 sbt test、sbt compile 和 sbt package。%% 运算符选择与当前 Scala 二进制版本匹配的工件后缀。sbt 本身可以使用不同于项目的 Scala 版本运行;启动器使用 sbt 内部所需的版本。

Coursier #

Coursier 解析 JVM 工件并安装 Scala 工具。它可以根据 Maven 坐标启动应用、缓存依赖并安装命名命令:

sh
cs launch scala:3.5.2 -- -version
cs install scala-cli

在自动化中使用明确的应用坐标和版本。只有在坐标和仓库受控时,Coursier 缓存才能提高可重复性;它不能替代依赖锁定或工件验证。

坐标、仓库与频道 #

Coursier 复用 Maven 坐标模型,并针对 Scala 特定工件进行了扩展:

  • group:app:version for a Java application;
  • group::app:version for a Scala artifact;
  • group:::app:version for a cross-version Scala artifact.

它从已配置的仓库解析依赖,然后将工件下载到本地缓存。仓库可以来自命令行、本地目录或频道描述符源。

频道是应用描述符 JSON 文件的集合。频道可以通过 HTTP 提供服务、由本地目录支持,或打包在 JAR 文件中。因此,Coursier 无需手写构建定义就能发现可安装的应用。

启动器与打包 #

Coursier 安装的是可执行启动器,而不是普通源代码树。已安装的命令通常是前置脚本的 JAR:先是一个小型启动器脚本,后面是 JAR 字节。Shell 包装器将 -J 选项传递给 JVM,然后运行嵌入应用的主类。

sh
cs install scala-cli
cs launch scala:3.5.2 -- -version

这种打包方式让用户可以直接运行 ./tool,同时保留供 java -jar 使用的完整 JAR 格式。实际的权衡是,启动器仍依赖缓存的工件和选定的仓库集合。

评论

在 GitHub 上阅读或评论(发表评论需要登录)