SBT构建一个基本工程

SBT安装

mac os可以利用homebrew进行安装:

brew install sbt

其他操作系统安装,略 ...

SBT约定的目录结构

build.sbt
src/
    main/
        resources/        #数据文件
        scala/               #scala源文件
        java/                #java源文件
    test/
        resources/        #数据文件
        scala/               #scala测试源文件
        java/                #java测试源文件
lib                            #jar文件
project
    build.properties
    plugins.sbt

以上只是稍微完整的sbt工程目录结构,虽然并不是每一部分都必须,但是最好遵守约定。
现在,手动构建工程目录结构(scala相关),命令如下:

touch build.sbt
mkdir -p src/main/resources src/main/scala src/test/resources/ src/test/scala/ lib/ project/
touch project/build.properties project/plugins.sbt

大多数项目需要一些手动设置。基本的构建设置都放在项目根目录的 build.sbt 文件里。 例如,如果你的项目放在 hello 下,在 hello/build.sbt 中可以这样写:

lazy val root = (project in file(".")).  
    settings(
    name := "hello",
    version := "1.0",
    scalaVersion := "2.11.7"
  )

如果你准备将你的项目打包成一个 jar 包,在 build.sbt 中至少要写上 name 和 version。

可以通过创建 project/build.properties 文件强制指定一个版本的 sbt。在这个文件里,编写如下内容来强制使用 0.13.8:

sbt.version=0.13.8

sbt 在不同的 release 版本中是 99% 兼容的。但是在 project/build.properties 文件中设置 sbt 的版本仍然能避免一些潜在的混淆。

.sbt构建定义

构建定义有三种风格。

  • 多工程 .sbt 构建定义
  • bare .sbt 构建定义
  • .scala 构建定义

本文讨论最新的多工程.sbt 构建定义,它结合了两种老风格的优点,并且适用于所有情况。此外,构建定义可以包含以.scala结尾的文件,位于基目录的project/文件夹下,来定义常用的函数和值。

将多个相关的项目定义在一个构建中是很有用的,尤其是如果它们依赖另一个,而且你倾向于一起修改它们。每个子项目在构建中都有它们自己的源文件夹,当打包时生成各自的 jar 文件,而且通常和其他的项目一样运转。

下面,我们构建一个子项目,位于hw目录下:

目录结构

build.sbt:

lazy val common_settings = Seq(
    organization    := "com.demo",
    version     := "0.0.0",
    scalaVersion    := "2.11.7"
)

lazy val hw = (project in file("hw")).settings(common_settings: _*).settings(
    name        := "hello"
)

现在我们可以在一处修改version,当重新加载构建时,将在各个子项目相应更新。

project/build.properties:

sbt.version=0.13.8

hw/src/main/scala/hw/Hello.scala

package hw

object Hello {
    def hello () = {
        println("hello world");
    }
}

依赖

构建中的项目完全可以彼此独立,但是通常情况下它们会有依赖上的一些相关性。有两种类型的依赖:aggregate 和 classpath。
Aggregation
Aggregation 意味着在 aggregate 项目上执行一个 task 也会在 aggregated 的项目执行。例如,

lazy val root = (project in file(".")).aggregate(util, core)
lazy val util = project ...
lazy val core = project ...

在上面的例子中,root 项目聚合了util和core。像例子中一样,随着有两个子项目的情况下启动 sbt,然后尝试编译。你应该会看到全部的三个项目都被编译了。
在进行聚合的项目中,像这个例子中的 root 项目一样,你可以按 task 来控制聚合。例如,为了避免聚合update task:

lazy val root = (project in file(".")).  
    aggregate(util, core).  
    settings(    
        aggregate in update := false  
)
[...]

Classpath 依赖

一个项目可能依赖另一个项目的代码。这是通过添加 dependsOn 方法来实现的。例如,如果 core 在 classpath 中需要 util,你将这样定义 core:

lazy val core = project.dependsOn(util)

现在 core 中的代码可以使用 util 的类。在编译时也会在两个项目之间创建顺序;在编译 core 之前,util 必须被更新和编译过。

为了依赖多个项目,像这样 dependsOn(bar, baz) 给 dependsOn 多个参数。

默认的 root 项目

如果在构建中根目录没有定义项目,sbt 会在构建中创建一个默认的项目并将其他项目也聚合起来。继续我们刚才创建的hw例子,因为 hw 项目定义了 base = file("hw"),它将会被包含在 hw 子目录中。它的源文件可以直接放在 hw 下,像 hw/Hw.scala,或者在 hw/src/main/scala 中。通常 sbt 的目录结构应用在hw目录下除了构建定义文件。hw 中的任何 .sbt 文件,比如说 hw/build.sbt,将会和整个构建合并,但是在 hw 项目的 scope 中。
如果你的的整个项目都在根目录中,尝试在 build.sbt,hw/build.sbt 中定义一个不同的版本(version := "0.6")。 现在在 sbt 的命令行中执行 show version。你应该得到这样的信息(随着你定义的任何版本):

> show version
[info] xxx/*:version
[info]  0.7
[info] xxx/*:version
[info]  0.9

每个项目的设置都可以放该项目基目录下的.sbt文件中,在子项目中,你不能有项目的子目录或者project/*.scala 文件。foo/project/Build.scala 将会被忽略。

交互式引导项目

在 sbt 的命令行中,输入 projects 列出你的项目,执行 project <projectname> 可以选择当前项目。当你执行 task 像 compile,它会在当前项目上执行。 所以你没有必要去编译 root 项目,你可以只编译子项目。

你可以通过显示的指定项目 ID 在另一个项目上执行一个 task,例如 subProjectID/compile。

详细代码位于github项目:https://github.com/tskshy/scala-demo.git

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容