43-天亮大数据系列教程之sbt介绍及环境搭建与使用

目录
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版本设置
//进入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官网说明
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
  • 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/

猜你喜欢

转载自blog.csdn.net/erliang20088/article/details/84449565