关于
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 语句。
这些表达式可以用 val
,lazy val
,def
声明。 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