1、安装
Window安装:
msi安装包 https://piccolo.link/sbt-0.13.16.msi
手动安装:https://piccolo.link/sbt-0.13.16.zip
1、解压,配置环境变量:SBT_PATH=解压路径, PATH=%PATH%;%SBT_PATH%
Linux安装:
1、将sbt-launch.jar (http://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/0.13.5/sbt-launch.jar)包放到目录 ~/bin中
2、创建一个运行jar包的脚本 ~/bin/sbt, 脚本内容为:
SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled-XX:MaxPermSize=256M"
java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"
3、确保脚本有执行权限
$ chmod u+x ~/bin/sbt
2、常用命令
进项目根目录,执行 sbt会生成 target 目录,结构如下:
target
├──scala-2.10
│ ├──classes
│ └──resolution-cache
└──streams
├──compile
├──$global
├──runtime
└──test
注意:配置项目版本控制项目的 .gitignore文件中应该包含 target/ , 注意:以 / 结尾(匹配目录中所有目录和文件)并且开头不包含/ (为了匹配 project/target/)
clean :删除所有构建生成的文件(在target目录中)
compile :编译项目源代码(编译src/main/scala 和 src/main/java 目录下的源代码)
test :编译并运行所有的测试用例
console :启动一个 Scala 语言交互模式, sbt 在启动的时候会指定依赖的所有classpath,
返回 sbt 可以用 :quit 、 Ctrl+D (Unix) 和Ctrl+Z (Windows)
run * :运行项目在虚拟机中
package :创建一jar 包其中包含src/main/resources 和编译 src/main/scala 或 src/main/java 目录的 class 文件
help :显示指定命令的帮助信息,如果没有指定命令将显示所有的命名的摘要信息。
reload :重新加载配置文件(build.sbt,project/.scala 和 project/.sbt 文件),当修改配置文件的时候需要执行
~compile :监视文件的改变
assembly :项目使用sbt-assembly来将工程class和依赖打到一个jar包中, 类似maven的assembly
(需要在项目根目录/project/plugins.sbt添加 addSbtPlugin(“com.eed3si9n” % “sbt-assembly” % “0.14.4”) 插件)
注意:当按一次 Tab 键是 sbt 会显示所有可能匹配的子集命令,当按多次 Tab 后将显示多个可能匹配的命令进行选择的提示,和 Unix tab 补全规则基本一致
3、配置文件
SBT基本概念:
SBT会根据当前项目的配置文件得到一个哈希映射表来描述整个项目,然后当你输入表中一个Key的名字时,sbt就会执行该key对应的任务(或者显示对应的值)。
项目的配置文件首先会生成一个大的配置列表 Seq[Setting],这个列表中每一个setting是对项目哈希表的一个更新,
会生成一个新的哈希表替换原来的哈希表,SBT实际生成该哈希表的时候会先对Seq[Setting]中的配置进行一下优化调整,
将对相同key的setting放到一起,同时被依赖的key放前面。
SBT的Key共有三种类型:
SettingKey[T]:这类key 的值只计算一次(当加载项目的时候计算完成后将一直保留)
内建 Keys 是调用对象 Keys 的成员变量,对于 build.sbt 隐式包含
import sbt.Keys._ , 所以 sbt.Keys.name 可以写作name
e.g:
name := "xxx"
version := "1.0"
scalaVersion :="2.12.2"
mainClass :=Some("xxxx")
selectMainClass :=Some("xxx")
assemblyJarName :="xxxx.jar"
assemblyOutputPath :=baseDirectory.value
logLevel := Level.Info
fork := true
TaskKey[T]:这类 key 的值将被作为任务调用,可以被重复调用计算的,也可能会产生影响
e.g:
lazy val switchTask =taskKey[String]("Switch Jrebel By Platform !")
switchTask :=System.getProperty("os.name").toUpperCase
javaOptions += {
if(switchTask.value.contains("WINDOWS")) {
println("is windowsplatform")
"-agentpath:" +baseDirectory.value / "jrebel64.dll"
} else {
println("is linuxplatform")
"-agentpath:" +baseDirectory.value / "libjrebel64.so"
}
}
InputKey[T]:这类key 是针对一个任务需要传递一些输入参数
e.g:
key3 := {
val args: Seq[String] =spaceDelimited("").parsed
args.mkString("-")
}
4、配置参数方法
配置项
一个工程构建定义一个Setting 类型的列表,通过sbt转化为sbt的描述数据结构(key-value 键值对),Setting作为一个转化前的输入类 型,转化后输出一个 map表。
一个 Setting类型的配置项可以通过 := 转化成一个值为一个常量的map表
配置值追加操作: += 和++=
• += 操作是追加单个元素到序列中
• ++= 操作是追加一个序列到序列中
lib库依赖:
非管理依赖方式:
非管理依赖方式的工作原理就是将jar包放到lib目录下,sbt会自动的将其添加到classpath中, 但是如果想自定义一个依赖目录而不 是默认的lib目录时,可以通过修改 unmanagedBase 参数配置, 比如用目录 custom_lib 替换 lib 目录
unmanagedBase := baseDirectory.value / "custom_lib"
管理依赖方式:
libraryDependencies参数配置,以下是申明一个包依赖关系,
其中 groupId , artifactId 和 revision 是字符串类型
libraryDependencies += groupID % artifactID % revision
远程依赖库地址管理
添加远程库的方法如下:
resolvers += name at location
e.g:
resolvers+=Resolver.url("aliyun",url("http://maven.aliyun.com/nexus/content/groups/public/"))