sbt 介绍
sbt是什么?
sbt到底是什么,在网上找找,似乎找不到一个非常准确,而且大家都认可的定义。
我自己对sbt的理解没有那么复杂,主要是以下这些。
sbt翻译为simple build tool
,这是一种较为直观的,而且比较符合sbt官网的一些信息:
在官网的首页上第一条就说明sbt是一个简单的构建工具,所以翻译为simple build tool
似乎也没有什么不妥。
不过就像网上有人评论,一般名字是简单的什么什么,最后做出来的都不简单。
sbt另一种翻译是scala build tool
。
在maven占据了java大部分的份额下,scala项目使用sbt作为构建工具的比例似乎比java要高点,而且,在sbt的官网首页上就说了,定义我们的scala任务,并行处理等等,所以翻译为scala build tool
似乎也没错。
总的来说,sbt怎么理解,都不会影响到我们对sbt的使用,你有自己的理解更好,看看我的理解也是一种。
sbt 下载
sbt的下载在官网上非常容易找到,甚至很显眼sbt - Download (scala-sbt.org)
最显眼的两个按钮,一个是下载,一个是文档,顺便提前说一下,sbt的文档是支持中文的,对我们学习sbt有很大的遍历性。也许,这可能是网上关于sbt的文章和资料较少的一个原因吧。
顺便夸赞一句,sbt的下载界面的布局,比起java来说,实在是好太多了,页面往下拉,就是最新版本,再往下拉,就是全部版本的下载,而且不用切换界面,就可以下载各种各样的包(zip,tgz,msi)
我下载的是1.6.1版本。
sbt 安装
我们在sbt的官网上打开sbt的文档sbt Reference Manual — sbt Reference Manual (scala-sbt.org)这是中文的文档,有些概念性的东西,英文可能更加准确,你可以随时切换。
我下载的是zip包,所以和java类似,将zip包下载后解压,然后配置环境变量即可。
我个人比较喜欢和java一样,配置SBT_HOME
然后把SBT_HOME
配置到环境变量Path
中
如何验证呢?
我们打开cmd,然后执行sbt version
需要注意的是,sbt必须要有java环境,而且在sbt的输出信息中,第一行中就会打印我们现在使用的sbt的版本和java的版本。
sbt 入门 – helloworld
安装好sbt后,文档中就给我们写了一个简单的helloworld的小例子。
我们在文件夹下创建hello的文件夹
然后我们创建一个hello.scala
文件,文件名字无所谓
然后使用在hello.scala中写入文档中给出的代码
object Hi {
def main(args: Array[String]) = println("Hi!")
}
然后我们在hello文件夹下打开cmd,我们直接在地址栏输入cmd回车,就会在这个路径下打开cmd。或者说会打开cmd然后切换到这个路径下
就像这样
然后我们输入sbt,启动sbt,让sbt自动初始化项目,sbt会提示我们文件夹没有找到build.sbt
文件,是否进行初始化,就像git一样,会生成自己的文件,我们选择c
接着就会进行初始化操作等等
在文件夹下会生成一些目录
其中.bsp
是sbt的启动配置文件夹,里面只有一个sbt.json
文件
内容如下
{"name":"sbt","version":"1.6.1","bspVersion":"2.0.0-M5","languages":["scala"],"argv":["E:\\java\\jdk\\jdk11/bin/java","-Xms100m","-Xmx100m","-classpath","E:\\sbt\\bin\\sbt-launch.jar","xsbt.boot.Boot","-bsp","--sbt-launch-jar=E:\\sbt\\bin\\sbt-launch.jar"]}
接着我们在cmd中的sbt shell 中输入compile进行编译
接着输入run执行scala文件
成功的执行了scala文件中的main方法。
而且sbt支持批量执行命令,但是不能在sbt shell中执行,在sbt shell中只能一个一个的命令执行。
我们先使用ctrl + D
退出sbt shell,然后在cmd中执行sbt clean compile run
命令
在我们执行过一个sbt的命令后,sbt会在./project
目录下生成一个build.properties
文件
内容就是指定了sbt的版本
在maven中,我们的项目的一些配置都会放在pom.xml
文件中,而sbt和maven非常类似,也是在项目根目录下的build.sbt
文件中
所以我们在hello
目录下创建build.sbt
文件
我的scala版本是2.12.15版本
我们在build.sbt
中定义项目
lazy val root = (project in file("."))
.settings(
name := "hello",
version := "1.0",
scalaVersion := "2.12.15"
)
这里说一下,.sbt
后缀的文件,使用的是兼容.scala
的特殊语法。
然后我们进入sbt shell
然后我们使用sbt的命令show name
查看项目的名字
除此之外,还记得project/build.properties
文件吗,这里也可以配置项目的信息,但是需要注意build.sbt
和build.properties
文件如果配置了不同的版本,那么哪个优先级更高呢?
发现build.sbt
的优先级高于build.properties
的配置
除此之外,在sbt shell中也可以配置项目的信息set name:="hisbtshell"
发现sbt shell 的优先级又高于build.sbt
的配置
sbt 目录结构
我们熟悉的maven项目中,源码文件和配置文件,都在约定俗成的目录结构
src/
main/
resources/
<files to include in main jar here>
java/
<main Java sources>
test/
resources
<files to include in test jar here>
java/
<test Java sources>
sbt和maven类似,在maven的基础上增加了scala的目录
src/
main/
resources/
<files to include in main jar here>
scala/
<main Scala sources>
scala-2.12/
<main Scala 2.12 specific sources>
java/
<main Java sources>
test/
resources
<files to include in test jar here>
scala/
<test Scala sources>
scala-2.12/
<test Scala 2.12 specific sources>
java/
<test Java sources>
需要注意因为scala版本的问题,会在各个版本的目录下实现特定版本的兼容的代码。
在project
目录中,不仅仅可以有build.properties
配置文件,还可以写一些scala
文件,用于我们项目的处理。
我们在git的.gitignore
文件中应该把编译的输出文件夹target
排除,使用target/
来排除,不仅仅是主项目的target,子项目的target也应该排除。
sbt 命令
在helloworld例子中我们已经接触了一些sbt的命令,比如reload,clean,compile,run
等。当然还有批量执行sbt命令。
实际上sbt的命令比想象中的更加强大,sbt支持监控文件是否变化,当文件被修改后,自动执行指定的命令
这需要在sbt shell中实现,方式就是在相关的单个命令前加上~
符号即可。
sbt常用命令
clean | 删除编译生成的文件(在target目录下) |
---|---|
compile | 编译文件(src/main/java和src/main/scala等) |
test | 编译和执行test |
console | 进入一个包含了依赖的scala shell中 |
run | 执行main方法 |
package | 打包生成jar |
help | 显示帮助信息 |
reload | 重新加载项目 |
sbt支持和linux中使用tab
自动补全命令。
sbt也支持历史命令,即使我们退出sbt shell,然后重新进入,这些历史命令也不会清除
! | 显示历史记录命令帮助。 |
---|---|
!! | 重新执行前一条命令。 |
!: | 显示所有之前的命令。 |
!:n | 显示之前的最后 n 条命令。 |
!n | 执行 !: 命令显示的结果中下标为 n 的命令。 |
!-n | 执行从该命令往前数第 n 条命令。 |
!string | 执行最近执行过的以 string 打头的命令。 |
!?string | 执行最近执行过的包含 string 的命令。 |
历史命令存储在target
目录下的.histroy3
文件内
如果你确实想清除历史命令记录,将这个文件清空即可
如下
总结
总的来说,sbt的文档还是挺友好的。一定记住,一般情况下,最准确的资料就是官方文档,遇到问题一般在官方文档中都能找到解决方案,即使找不到解决方案,官方文档也会给出联系方式,用于我们直接与开发者沟通。
sbt的简单使用并不是很难,只要稍微看下官方文档,就能入门。