目录
1、sbt介绍
2、环境搭建与HelloWorld使用
3、常用参数配置方法与示例
4、插件配置方法与示例
详情
1、sbt介绍
-
定义
- 全称为Simple build tool
- sbt是类似MAVEN的构建工具,是Scala事实上的标准构建工具。
-
主要特点
- 简单项目很少或根本不需要配置
- 原生支持编译Scala代码和与诸多Scala测试框架进行交互
- 基于Scala的构建定义,使用Scala编写的DSL(领域特定语言)构建描述,可以使用Scala代码的完全灵活性
- 使用Ivy作为库管理工具
- 持续编译、测试和部署
- 整合scala解释器快速迭代和调试
- 支持Java与Scala混合的项目,但大多情况还是scala代码调用java的库
- 子项目支持模块化
- 并行任务执行,包括并行测试执行等
- 使用从编译器中提取的信息进行准确的增量重新编译:只编译修改的、及受影响的类
-
优点
- 主要特点也是优点的一部分
- 简单、易用、强大,与maven构建方面比较相似,有maven基础学习sbt比较简单。
-
缺点
- 成熟度上相对maven要欠缺一些,存在更多的bug。
- 构建功能上不如maven齐全,并不能完全覆盖maven的功能点,但绝大多数情况已满足使用要求。
-
发展前景
-
应运而生
- scala语言强大,并打造了spark、kafka等众多明星级大数据常用开发平台或组件,而sbt是专为scala项目构建而生,故应用前景很广阔。
-
版本迭代发展快
- 虽然bug和用户体验欠佳,但开发团队版本更新与优化很快,故可期性非常强。
-
2、环境搭建与HelloWorld使用
- 搭建说明
-
开发环境基本均在windows上,故搭建仅以windows为示例,如linux,mac之类的参考官网即可。
-
搭建步骤
- 1)版本选择
- 2)安装包下载-msi
- 3)安装包解压与安装
- 4)sbt基本使用方法与HelloWorld实现
- 5)sbt常用参数设置方法与示例
- 6)sbt与eclipse插件集成方法与示例
-
步骤详情
-
1)版本选择
-
版本列表
-
版本确定逻辑
- 社区查找口碑好的版本,发现1.x之前的版本反馈bug问题太多。
- 在1.x的版本当中,找个次最新的即可,故确定为1.2.0
-
-
-
其运行依赖于JDK-1.8版本及以上。
* 2)安装包下载-msi
* 从官网,如上图所示的下载
* 从天亮教育官方云盘中下载
- 3)安装包解压与安装
-
双击无脑式安装即可
-
安装完成后的目录结构查看
-
4)sbt基本使用方法与HelloWorld实现
- 1、创建项目基础目录,用于存放项目的相关构建脚本、源代、发布包等。
-
cd 任意文件目录中
mkdir FirstSbt
cd FirstSbt
//创建一个用于构建项目的基础sbt脚本
touch build.sbt
- 2、启动sbt shell,会有一定的sbt自身依赖的jar包下载,一般会有几分钟的等待时间
//进入基础目录
cd FirstSbt
//输入sbt命令
sbt
//正式启动完成,会有如下显示:
sbt:firstsbt>
-
3、退出sbt shell,使用ctrl+d或ctrl+z,或是exit均可以退出
-
4、编译代码
- compile:全量编译
- ~compile:增量编译,只编译最新修改过的源码文件
-
5、HelloWorld实现
- 在基础目录下,创建目录src/main/scala/com/tl/job003目录
- 在job003目录下,新建HelloWorld.scala源码文件
- 源码如下所示:
-
package com.tl.job003;
object HelloWorld extends App {
println("HelloWorld!");
}
-
进入sbt环境后,执行编译-compile
-
运行-run
-
目录结构说明
FirstSbt (base directory:基础目录)
build.sbt (自定义构建项目的脚本文件,默认命名为build.sbt,可以自定义为*.sbt)
.gitignore (版本管理使用的配置文件,用于忽略文件或目录)
project/ (自动生成辅助构建项目的脚本文件,更细节更具体,也可手动调整)
xx.scala (defines helper objects and one-off plugins,辅助对象和一次性插件)
xx.sbt (并不等价于基本目录下的sbt文件)
src/ (基础目录下的源代码根目录,大多数情况下一个src目录就够了)
main/
resources/ (files to include in main jar here)
scala/ (main scala sources)
java/ (main java sources)
test/
resources/ (files to include in test jar here)
scala/ (test scala sources)
java/ (test java sources)
target/ (generated files, like compiled classes, packaged jars, managed files, caches, and documentation)
-
常用sbt命令
clean
删除所有生成的文件 (在 target 目录下)。
compile
编译源文件(在 src/main/scala 和 src/main/java 目录下)。
test
编译和运行所有测试。
console
进入到一个包含所有编译的文件和所有依赖的 classpath 的 Scala 解析器。输入 :quit, Ctrl+D (Unix),或者 Ctrl+Z (Windows) 返回到 sbt。
run <参数>*
在和 sbt 所处的同一个虚拟机上执行项目的 main class。
package
将 src/main/resources 下的文件和 src/main/scala 以及 src/main/java 中编译出来的 class 文件打包成一个 jar 文件。
help <命令>
显示指定的命令的详细帮助信息。如果没有指定命令,会显示所有命令的简介。
reload
重新加载构建定义(build.sbt, project/.scala, project/.sbt 这些文件中定义的内容)。在修改了构建定义文件之后需要重新加载。 -
3、常用参数配置方法与示例
- 1)sbt常用参数设置方法与示例
- scala版本设置
- 1)sbt常用参数设置方法与示例
//进入sbt环境后,自定义设置scala版本,使项目可以顺利行在各不同scala版本中
set ThisBuild / scalaVersion := "2.11.11"
//查看当的scala版本
scalaVersion
//更新修改到基础build.sbt中
session save
//查看修改下图
cat build.sbt
- 2)项目名称设置(注意:每个行中间必须有个空行)
- 基础目录下的build.sbt修改
ThisBuild / scalaVersion := "2.11.11"
ThisBuild / organization := "com.tl.job003"
lazy val helloworld = (project in file("."))
.settings(
name := "HelloWorld",
version := "1.0.0"
)
- 重新加载配置文件与执行
// 使用该reload命令重新加载构建。该命令导致 build.sbt重新读取文件,并应用其设置。
reload
//重新编译,会根据上边设置新scalaVersion编译,将有新的依赖包下载,第一次会稍等若干分钟
//并注间查看编译完成后,目录的变化
compile
//重新执行,结果与之前一致
run
- 3)库依赖项配置与使用
- 库依赖添加语法
//模板格式,即组ID、构件ID、版本、配置项参数
libraryDependencies += groupID % artifactID % revision % configuration
//示例1,添加derby依赖,所以参数均为固定无任何可变项
libraryDependencies += "org.apache.derby" % "derby" % "10.4.1.3"
//示例2,添加logback依赖,所以参数均为固定无任何可变项
libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.1.2",
//示例3,使用%%方式添加scalatest依赖,会自动根据设置scalaVersion参数,找到正确的组件对应的scala编译版本
//最后的Test选项,即为只在Test时有效,其它范围无效
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.5" % Test
- 仓库源自定义优化
- 仓库源自定义模板
//模板
resolvers += name at location
//示例1
resolvers += "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots"
//示例2,使用本地maven仓库
resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"
//示例3,与示例2效果完全等同
resolvers += Resolver.mavenLocal
//示例4,添加阿里云仓库源
resolvers += "aliyun-nexus" at "http://maven.aliyun.com/nexus/content/groups/public/"
- 配置仓库源生效-本项目中
- sbt是按仓库源配置的先后顺序匹配具体的组件,项目配置仓库源往往起不到预期的效果
ThisBuild / scalaVersion := "2.11.11"
ThisBuild / organization := "com.tl.job003"
lazy val helloworld = (project in file("."))
.settings(
name := "HelloWorld",
libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.1.2",
libraryDependencies += "com.typesafe.scala-logging" %% "scala-logging-slf4j" % "2.1.2",
resolvers += Resolver.mavenLocal,
resolvers += "aliyun-nexus" at "http://maven.aliyun.com/nexus/content/groups/public/",
resolvers += "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots"
)
- 全局仓库源配置方式
- 使得全部项目均优先使用该仓库,起到maven镜像仓库的作用,类比于maven中的~/.m2/setting.xml配置
- 在~/.sbt中新建一个空白文件repositories,添加如下所示的仓库源即可
[repositories]
maven-local
aliyun-nexus: http://maven.aliyun.com/nexus/content/groups/public/
ibiblio-maven: http://maven.ibiblio.org/maven2/
uk-repository: http://uk.maven.org/maven2/
jboss-repository: http://repository.jboss.org/nexus/content/groups/public/
- 通过新增一个maven本地已有的库,即可快速验证(自行验证)
- 添加日志功能组件
- 基础目录build.sbt修改
ThisBuild / scalaVersion := "2.11.11"
ThisBuild / organization := "com.tl.job003"
lazy val helloworld = (project in file("."))
.settings(
name := "HelloWorld",
libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.1.2",
libraryDependencies += "com.typesafe.scala-logging" %% "scala-logging-slf4j" % "2.1.2"
)
- 新建TestLog4TL.scala类,使用日志功能
package com.tl.job003;
import org.slf4j.LoggerFactory
import com.typesafe.scalalogging.slf4j.Logger
object TestLog4TL extends App {
val logger = Logger(LoggerFactory.getLogger("TestLog4TL"))
logger.debug("log function is very important!")
}
-
测试执行
-
4、插件配置方法与示例
- 1)插件配置与使用
-
sbt插件介绍
- 插件扩展了构建定义,最常见的是添加新设置,新设置可能是新任务。
- 主要是为了更好的扩大sbt边界,更方便、更快捷、更灵活、更强大。
-
插件种类
- 全局插件:在~/.sbt/1.0/plugins目录中添加对应的插件.sbt脚本即可,完成后在任何项目中均可以使用。
- 项目局部插件:在项目基础目录/project/添加对应的插件的.sbt脚本即可,仅对当前项目有效。
-
插件配置与使用方法-assembly插件
- 全局配置方法
- 在~/.sbt/1.0目录下新建plugins目录,将所有的新增的插件均放在该目录下。
- 在plugins中,新建assembly.sbt文件,加入以下插件添加脚本:
- 注意事项:sbt和sbt-assembly是有相对严格的对应关系,应查实后进行个性化配置,具体可查看其github官网说明
- 全局配置方法
-
- 1)插件配置与使用
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.7")
-
在项目中执行reload或是重新启动sbt,将会自动加载插件
-
执行assembly命令,观查基础目录/target/scala.xxx/下的发布包的变化
-
冲突jar问题的解决
-
解决方法
-
删除冲突的jar,即通过exclude的方式将某个jar包排除在外,不打到包中。
-
通过jar包对应的configuration配置参数项即可,如test,provided等起到exclude的作用。
*
合并冲突:给出冲突的位置应该如何进行合并处理,最终达到打包的要求。*
-
-
-
sbt-assembly在打包时,默认合并策略是验证所有候选项具有相同的内容,否则出错。并给出了多种冲突的合并策略,具体如下。
*
MergeStrategy.deduplicate 是上面描述的默认值
*
MergeStrategy.first 以类路径顺序选择第一个匹配文件
*
MergeStrategy.last 挑选最后一个
*
MergeStrategy.singleOrError 在冲突时出现错误消息
*
MergeStrategy.concat 简单地连接所有匹配的文件
*
MergeStrategy.filterDistinctLines 也是连接,但在此过程中遗漏了重复
*
MergeStrategy.rename 重命名源自jar文件的文件
*
MergeStrategy.discard 只是丢弃匹配的文件
*
合并配置示例:在build.sbt中添加
assemblyMergeStrategy in assembly := {
case PathList("javax", "servlet", xs @ _*) => MergeStrategy.first
case PathList(ps @ _*) if ps.last endsWith ".html" => MergeStrategy.first
case "application.conf" => MergeStrategy.concat
case "unwanted.txt" => MergeStrategy.discard
case x =>
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
}
-
项目局部配置插件方法
-
与全局的唯一区别在于assembly.sbt位置的不同,该情况是将该文件放于项目基础目录/project/下即可。
- 其它与全局相似,可自行验证。
-
assembly打包后测试运行
- 以FirstSbt assembly打包为例,包路径在基础目录/target/scala-2.10/HelloWorld-assembly-0.1.0-SNAPSHOT.jar
- 运行方式:java -cp ./HelloWorld-assembly-0.1.0-SNAPSHOT.jar com.tl.job003.HelloWorld
* 2)sbt与eclipse插件集成方法与示例
*
全局eclispe插件配置
*
在~/.sbt/1.0/plugins/目录中,新建文件sbteclispe.sbt,并添加如下内容
addSbtPlugin(“com.typesafe.sbteclipse” % “sbteclipse-plugin” % “5.2.4”)
- 生成eclipse项目
- a、新建基础目录FirstEclipseSbt
mkdir FirstEclipseSbt
cd FirstEclipseSbt
- a、新建基础目录FirstEclipseSbt
- b、新建build.sbt,并写入相应构建脚本
touch build.sbt
name := "FirstEclipseSbt"
scalaVersion := "2.11.11"
organization := "com.tl.job003"
libraryDependencies ++= Seq(
"org.jsoup" % "jsoup" % "1.11.1",
"ch.qos.logback" % "logback-classic" % "1.1.2",
"com.typesafe.scala-logging" %% "scala-logging-slf4j" % "2.1.2",
)
天亮教育是一家从事大数据云计算、人工智能、教育培训、产品开发、咨询服务、人才优选为一体的综合型互联网科技公司。
公司由一批BAT等一线互联网IT精英人士创建,
以"快乐工作,认真生活,打造高端职业技能教育的一面旗帜"为愿景,胸怀"让天下没有难找的工作"使命,
坚持"客户第一、诚信、激情、拥抱变化"的价值观,
全心全意为学员赋能提效,践行技术改变命运的初心。
更多学习讨论, 请加入
官方-天亮大数据交流-366784928
群二维码:
天亮教育公开课-从小白到大佬修成记-全系列视频地址:http://bbs.myhope365.com/forum.php?mod=viewthread&tid=1422&extra=page%3D1
欢迎关注天亮教育公众号,大数据技术资料与课程、招生就业动态、教育资讯动态、创业历程分享一站式分享,官方微信公众号二维码:
天亮教育官方群318971238,
爬虫、nlp技术qq群320349384
hadoop & spark & hive技术群297585251
教育培训官网:http://myhope365.com
项目研发业务尚云科技官网:http://shangyuninfo.com/
官方天亮论坛:http://bbs.myhope365.com/