Scala之SBT

关于

SBT是 Scala 的构建工具,全称是 Simple Build Tool, 类似 Maven 或 Gradle。 SBT 的野心很大,采用Scala编程语言本身编写配置文件,这使得它稍显另类,虽然增强了灵活性,但是对于初学者来说同时也增加了上手难度。

SBT有很多版本从1.0.0进行了Scala版本及JDK的版本升级,以及一些调整

  • sbt 1.0 uses Scala 2.12 for build definitions and plugins. This also requires JDK 8.

常用命令

sbt assembly  #打 fat jar包

 

配置

系统配置目录: ~/.sbt/repositories     如果要更改这个目录,参考: 链接

工程配置文件:

project/project/
project/target/
target/ 

.sbt 构建定义

build.sbt 定义了一个 Project,它持有一个名为settings的scala表达式列表。

下面是一个例子:

ThisBuild / organization := "com.example"
ThisBuild / scalaVersion := "2.12.13"
ThisBuild / version      := "0.1.0-SNAPSHOT"

lazy val root = (project in file("."))
  .settings(
    name := "hello"
  )

每一项 Setting 都定义为一个 Scala 表达式。在 settings 中的表达式是相互独立的,而且它们仅仅是表达式,不是完整的 Scala 语句。

这些表达式可以用 vallazy valdef 声明。 build.sbt 不允许使用顶层的 object 和 class。它们必须写到 project/ 目录下作为完整的 Scala 源文件。

在左边,name, version 和 scalaVersion 都是 键(keys)。一个键(key)就是一个 SettingKey[T]TaskKey[T] 或者 InputKey[T] 的实例,T 是期望的 value 的类型。 key 的类别将在下面讲解。

键(Keys)有一个返回 Setting[T] 的 := 方法。你可以像使用 Java 的语法一样调用该方法:

lazy val root = (project in file("."))
  .settings(
    name.:=("hello")
  )

但是,Scala 允许 name := "hello" 这样调用(在 Scala 中,一个只有单个参数的方法可以使用任何一种语法调用)。

键(key)name 上的 := 方法会返回一个 Setting,在这里特指 Setting[String]String 也出现在 name 自身的类型 SettingKey[String] 中。 在这个例子中,返回的 Setting[String] 是一个在 sbt 的 map 中增加或者替换键为 name 的转换,赋值为 "hello"

如果你使用了错误类型的 value,构建定义会编译不通过:

lazy val root = (project in file("."))
  .settings(
    name := 42  // 编译不通过
  )

默认值

sbt默认Scala源码路径:src/main/scala  测试源码路径:src/test/scala, 如果要修改,设置scalaSource,举例:

Compile / scalaSource := baseDirectory.value / "src"

Test / scalaSource := baseDirectory.value / "test-src"

默认Java源码路径:src/main/java  测试源码路径:src/test/java, 如果要修改,设置javaSource,举例: 

Compile / javaSource := baseDirectory.value / "src"

Test / javaSource := baseDirectory.value / "test-src"

注:scala源码可以和和java源码在相同的目录

项目样例

import sbtprotobuf.{ProtobufPlugin=>PB}

PB.protobufSettings
version in PB.protobufConfig := "3.2.0"

unmanagedResourceDirectories in Compile <+= (sourceDirectory in PB.protobufConfig)
javaSource in PB.protobufConfig <<= (sourceDirectory in Compile)(_ / "generated")
compileOrder := CompileOrder.JavaThenScala

lazy val commonSettings = Seq(
  organization := "com.my.test",
  version := "0.1.0",
  scalaVersion := "2.11.8"
)

lazy val root = (project in file(".")).
  settings(commonSettings: _*).
  settings(
    PB.protobufSettings : _*).
  settings(
    name := "anti-batch",

    libraryDependencies += "org.apache.spark" %% "spark-core" % "2.1.0" % "provided",
    libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.1.0" % "provided",
    libraryDependencies += "org.apache.spark" %% "spark-hive" % "2.1.0" % "provided",
    libraryDependencies += "org.apache.spark" %% "spark-mllib" % "2.1.0" % "provided",
    libraryDependencies += "org.json4s" %% "json4s-native" % "3.3.0",
    libraryDependencies += "org.scalatest" %% "scalatest" % "2.2.4" % "test",
    libraryDependencies += "com.google.protobuf" % "protobuf-java" % (version in PB.protobufConfig).value % PB.protobufConfig.name,
    libraryDependencies += "org.scalanlp" %% "breeze" % "0.13.2",
    libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.40",
    libraryDependencies += "org.scala-lang.modules" %% "scala-parser-combinators" % "1.0.2",
    libraryDependencies += "com.hadoop.compression" % "hadoop-gpl-compression" % "0.1.0",
    libraryDependencies += "org.json4s" %% "json4s-jackson" % "3.4.1" ,
    libraryDependencies += "org.json4s" %% "json4s-native" % "3.3.0" ,
    libraryDependencies += "org.yaml" % "snakeyaml" % "1.19-SNAPSHOT" ,
    libraryDependencies += "commons-cli" % "commons-cli" % "1.4",
    test in assembly := {}
  )

parallelExecution in Test := false

资料

https://www.scala-sbt.org/index.html

https://github.com/sbt/sbt

https://github.com/sbt/sbt/releases?after=v1.0.0

https://www.scala-sbt.org/1.x/docs/zh-cn/Basic-Def.html

https://www.scala-sbt.org/0.13/docs/Launcher-Configuration.html

posted on 2021-02-20 18:15  cfox  阅读(1832)  评论(0编辑  收藏  举报

导航