Scala 与 SBT

SBT

SBT 即 Scala Build Tools,也就是 Scala 项目的构建工具。它和其他 Java 系列的 Build Tools 例如 Maven 和 Gradle 基本是同一个等级上的概念,只不过 SBT 只能用于 Scala 项目。
为什么要用 SBT 而不用已经存在的强大构建工具 Gradle 呢?我觉得这两点足矣:

  1. SBT 是 Scala 技术栈的一员,而 Gradle 属于 Groovy 技术栈(虽然它同样适合 Java 和 Android 以及 Scala)
  2. SBT 专门为 Scala 项目设计,某些时候会发现它更精小。并且它自身就充满了 Scala 风格。

安装 SBT

  1. 在系统上使用 SBT:

    1. 假设你是 DEB 系列的 Linux,接连执行下面四条命令,即可。

      echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
      sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
      sudo apt update
      sudo apt install sbt
      

      如果你用的是其它系统,请参考官方文档

    2. 终端执行 sbt 命令,让其完成初始化。

  2. 在 Intellij IDEA 上使用 SBT:

    1. 安装 Scala 插件
    2. 创建一个 Scala -> SBT 项目,让 SBT 初始化。

    注意:IDEA 上有一个 SBT 插件,它和 Scala 插件内置的 SBT 并不冲突。但是它们的配置不共享,也就是例如 JVM_OPTS 都在插件各自的配置项里边,它可装可不装。

SBT 配置代理

由于不可描述原因,在中国大陆使用这些工具难免会遇到网络问题。而 SBT 和 Maven 类似,第一次安装的时候是一个最小版本,之后根据执行的命令等下载相应的功能依赖,所以你如果不解决网络问题,别说 SBT 无法下载项目依赖了,就连 SBT 自身都无法使用。

SBT 配置代理的方式挺多的,但归根结底就是一个:配置 JVM_OPTS 参数(添加网络代理参数给要启动的 JVM 进程)

注意:IDEA 的 Scala 插件跟系统上有没有装 SBT 无关,不管有没有装,插件都会下载自己的 SBT 插件包,所以这里分别提供系统 SBT 和 IDEA 插件的代理配置方式。

给系统 SBT 配置网络代理:

  1. .jvmopts 文件

    这种方式是首推的方式。在项目根目录创建 .jvmopts 文件,配置例子如下:

    -Dhttp.proxyHost=localhost
    -Dhttp.proxyPort=8118
    -Dhttps.proxyHost=localhost
    -Dhttps.proxyPort=8118
    -Dhttp.nonProxyHosts="localhost|127.0.0.1|10.*.*.*"
    -Dhttps.nonProxyHosts="localhost|127.0.0.1|10.*.*.*"
    

    记得把上面的 Host 和 Port 改成自己的。这样在终端使用 sbt 网络会全部走配置中的代理。

  2. 修改 SBT 全局配置

    编辑 sbtconfig.txt 文件,完整路径如下:

    /usr/share/sbt-launcher-packaging/conf/sbtconfig.txt
    

    添加 .jvmopts 中的内容。这样就全局配置了 sbt 的网络代理,无需再给每个项目创建 .jvmopts

给 Intellij 插件配置网络代理

插件安装好以后,创建 SBT 项目 IDEA 的右侧会出现跟 Maven Projects 一样的面板可以展开(SBT projects)。用于刷新项目配置和查看项目依赖等功能。

由于插件 SBT 和系统 SBT 互相独立,故插件不会理睬系统上的 SBT 配置,经过测试也不会读取 .jvmopts 文件。所以上述两种在插件上都行不通。所以只能直接配置 JVM_OPTS 了,好在插件一般都开放配置。

打开设置,在 Build, Execution, Deployment > Build Tools > SBT 里边,有一个 JVM Options 区域,VM paramenters 配置项,展开粘贴 .jvmopts 文件内容即可,然后插件 SBT 所有操作的网络都会走配置的代理。

总结

SBT 的代理配置其实就是原始的 JVM_OPTS 参数。无论是添加约定好的配置文件也好还是给 JVM 进程加参数,本质上都是一样的。而且基本上只有解决了网络问题才能使用 SBT。