如何使SBT圣光使者任务必须做吗中使用一个特定的配置范围是什么

查看: 133523|回复: 7
用SBT编译Spark的WordCount程序
主题帖子积分
问题导读:
1.什么是sbt?
2.sbt项目环境如何建立?
3.如何使用sbt编译打包scala?
sbt是一个代码编译工具,是scala界的mvn,可以编译scala,java等,需要java1.6以上。
sbt项目环境建立
sbt编译需要固定的目录格式,并且需要联网,sbt会将依赖的jar包下载到用户home的.ivy2下面,目录结构如下:
|--build.sbt
|--lib
|--project
|--src
|& &|--main
|& &|& & |--scala
|& &|--test
|& && && &|--scala
|--sbt
|--target复制代码以上建立目录如下:
mkdir -p ~/spark_wordcount/lib
mkdir -p ~/spark_wordcount/project
mkdir -p ~/spark_wordcount/src/main/scala
mkdir -p ~/spark_wordcount/src/test/scala
mkdir -p ~/spark_wordcount/target复制代码
然后拷贝spark安装目录的sbt目录的 sbt脚本和sbt的jar包
cp /path/to/spark/sbt/sbt* ~/spark_wordcount/复制代码
由于spark的sbt脚本默认查找./sbt目录,修改如下
JAR=sbt/sbt-launch-${SBT_VERSION}.jar
to
JAR=sbt-launch-${SBT_VERSION}.jar复制代码
拷贝spark的jar包到,sbt的lib目录
cp /path/to/spark/assembly/target/scala-2.10/spark-assembly_2.10-0.9.0-incubating-hadoop2.2.0.jar \
& ~/spark_wordcount/lib/ 复制代码
建立build.sbt配置文件,各行需要有一个空行分割
name := &WordCount&
[this is bank line]
version := &1.0.0&
[this is bank line]
scalaVersion := &2.10.3&复制代码
由于spark的sbt脚本需要到project的build.properties文件找sbt的版本号,我们建立该文件,增加如下内容:
sbt.version=0.12.4复制代码
Spark WordCount程序编写及编译
建立WordCount.scala源文件,假设需要包为spark.example
mkdir -p ~/spark_wordcount/src/main/scala/spark/example
vi -p ~/spark_wordcount/src/main/scala/spark/example/WordCount.scala复制代码
添加具体的程序代码,并保存
package spark.example
import org.apache.spark._
import SparkContext._
object WordCount {
&&def main(args: Array[String]) {
& & //命令行参数个数检查
& & if (args.length == 0) {
& && &System.err.println(&Usage: spark.example.WordCount &input& &output&&)
& && &System.exit(1)
& & }
& & //使用hdfs文件系统
& & val hdfsPathRoot = &hdfshost:9000&
& & //实例化spark的上下文环境
& & val spark = new SparkContext(args(0), &WordCount&,
& && &System.getenv(&SPARK_HOME&),SparkContext.jarOfClass(this.getClass))
& & //读取输入文件
& & val inputFile = spark.textFile(hdfsPathRoot + args(1))
& & //执行WordCount计数
& & //读取inputFile执行方法flatMap,将每行通过空格分词
& & //然后将该词输出该词和计数的一个元组,并初始化计数
& & //为 1,然后执行reduceByKey方法,对相同的词计数累
& & //加
& & val countResult = inputFile.flatMap(line =& line.split(& &))
& && && && && && && & .map(word =& (word, 1))
& && && && && && && & .reduceByKey(_ + _)
& & //输出WordCount结果到指定目录
& & countResult.saveAsTextFile(hdfsPathRoot + args(2))
&&}
}复制代码
到spark_wordcount目录,执行编译:
cd ~/spark_wordcount/
./sbt compile复制代码
打成jar包
./sbt package复制代码
编译过程,sbt需要上网下载依赖工具包,jna,scala等。编译完成后可以在target/scala-2.10/目录找到打包好的jar
[root@bd001 scala-2.10]# pwd
/usr/local/hadoop/spark_wordcount/target/scala-2.10
[root@bd001 scala-2.10]# ls
cache&&classes&&wordcount_2.10-1.0.0.jar复制代码
WordCount执行
可以参考Spark分布式运行于hadoop的yarn上的方法,写一个执行脚本
#!/usr/bin/env bash
SPARK_JAR=./assembly/target/scala-2.10/spark-assembly_2.10-0.9.0-incubating-hadoop2.2.0.jar \
& & ./bin/spark-class org.apache.spark.deploy.yarn.Client \
& && &--jar ~/spark_wordcount/target/scala-2.10/wordcount_2.10-1.0.0.jar \
& && &--class&&spark.example.WordCount \
& && &--args yarn-standalone \
& && &--args /testWordCount.txt \
& && &--args /resultWordCount \
& && &--num-workers 3 \
& && &--master-memory 4g \
& && &--worker-memory 2g \
& && &--worker-cores 2复制代码
然后,拷贝一个名为testWordCount.txt的文件进hdfs
hdfs dfs -copyFromLocal ./testWordCount.txt /testWordCount.txt复制代码
然后执行脚本,过一会就可以看到结果了
欢迎加入about云群 、 ,云计算爱好者群,关注
主题帖子积分
中级会员, 积分 600, 距离下一级还需 400 积分
中级会员, 积分 600, 距离下一级还需 400 积分
spark目录下哪里有sbt目录?????
spark1.2.0
主题帖子积分
新手上路, 积分 39, 距离下一级还需 11 积分
新手上路, 积分 39, 距离下一级还需 11 积分
spark-1.6 目录下也没有sbt目录,楼主,咋整 。。。
主题帖子积分
注册会员, 积分 58, 距离下一级还需 142 积分
注册会员, 积分 58, 距离下一级还需 142 积分
拷贝spark的jar包到,sbt的lib目录
cp /path/to/spark/assembly/target/scala-2.10/spark-assembly_2.10-0.9.0-incubating-hadoop2.2.0.jar \
& ~/spark_wordcount/lib/
这一步复制的是什么jar? 是spark的lib目录里的jar还是spark的安装包?
我的spark安装包是.gz格式的
主题帖子积分
注册会员, 积分 58, 距离下一级还需 142 积分
注册会员, 积分 58, 距离下一级还需 142 积分
123.png (11.28 KB, 下载次数: 19)
14:56 上传
出现了这个报错能帮忙解决一下吗?
主题帖子积分
高级会员, 积分 2383, 距离下一级还需 2617 积分
高级会员, 积分 2383, 距离下一级还需 2617 积分
拷贝spark的jar包到,sbt的lib目录
cp /path/to/spark/assembly/target/scala-2.10/spark-assembly_2.10-0 ...
安装包需要解压,里面有很多jar包。里面搜搜应该就能找到
主题帖子积分
高级会员, 积分 2383, 距离下一级还需 2617 积分
高级会员, 积分 2383, 距离下一级还需 2617 积分
出现了这个报错能帮忙解决一下吗?
错误看不出太多的问题,可能是类型的问题
主题帖子积分
中级会员, 积分 245, 距离下一级还需 755 积分
中级会员, 积分 245, 距离下一级还需 755 积分
他已经解决了
经常参与各类话题的讨论,发帖内容较有主见
经常帮助其他会员答疑
活跃且尽责职守的版主
为论坛做出突出贡献的会员
站长推荐 /4
云计算hadoop视频大全(新增 yarn、flume|storm、hadoop一套视频
等待验证会员请验证邮箱
新手获取积分方法
技术类问答,解决学习openstack,hadoop生态系统中遇到的问题
Powered by本文讲的是查看 sbt 项目的依赖关系树的教程,
sbt 是借助于 ivy 来管理项目依赖, 像 Maven 项目中可以用 dependency:tree 来显示依赖树, 那么对于 sbt 项目该如何查看项目依赖关系呢? 本文提及了三种方式来显示项目依赖, 它们是 Shell 脚
sbt 是借助于 ivy 来管理项目依赖, 像 Maven 项目中可以用 dependency:tree 来显示依赖树, 那么对于 sbt 项目该如何查看项目依赖关系呢? 本文提及了三种方式来显示项目依赖, 它们是 Shell 脚本, 自定义 sbt 任务, 和 sbt-dependency-plugin 方式. 最后一个办法使得我们也能用 dependencyTree 显示出 Maven 的
dependency:tree 效果来, 还有更酷的的.
& dependencyTree
[info] default:test_2.10:0.1-SNAPSHOT [S]
+-ch.qos.logback:logback-classic:1.0.13
+-ch.qos.logback:logback-core:1.0.13
+-org.slf4j:slf4j-api:1.7.5
[success] Total time: 0 s, completed Apr 5, :53 AM
下面是探索的全部过程.
通过 sbt 控制台的 tab
自动完成或用 help .*[Dd]ependenc.* 命令再进一步过滤出与依赖比较接近 sbt 控制台任务
dependencyClasspath
The classpath consisting of internal and external, managed and unmanaged dependencies.
externalDependencyClasspath
The classpath consisting of library dependencies, both managed and unmanaged.
internalDependencyClasspath
The internal (inter-project) classpath.
projectDependencies
Inter-project dependencies.
excludeDependencies
Declares managed dependency exclusions.
dependencyCacheDirectory
The base directory for cached dependencies.
allDependencies
Inter-project and library dependencies.
libraryDependencies
Declares managed dependencies.
dependencyOverrides
Declares managed dependency overrides.
trackInternalDependencies
The level of tracking for the internal (inter-project) dependency.
dependencyPositions
Source positions where the dependencies are defined.
来深入, 我们建立一个简单的项目, 文件目录如下
├── build.sbt
└── lib
└── guava-18.0.jar
build.sbt 文件的内容是
libraryDependencies ++= Seq(
"ch.qos.logback" % "logback-classic" % "1.0.13"
我们来看看 sbt 的
dependencyClasspath, externalDependencyClasspath, 和 internalDependencyClasspath 的输出
& show dependencyClasspath
[info] List(Attributed(/Users/uqiu/test/lib/guava-18.0.jar), Attributed(/Users/uqiu/.sbt/boot/scala-2.10.6/lib/scala-library.jar), Attributed(/Users/uqiu/.ivy2/cache/ch.qos.logback/logback-classic/jars/logback-classic-1.0.13.jar), Attributed(/Users/uqiu/.ivy2/cache/ch.qos.logback/logback-core/jars/logback-core-1.0.13.jar), Attributed(/Users/uqiu/.ivy2/cache/org.slf4j/slf4j-api/jars/slf4j-api-1.7.5.jar))
[success] Total time: 0 s, completed Apr 4, :57 PM
& show externalDependencyClasspath
[info] List(Attributed(/Users/uqiu/test/lib/guava-18.0.jar), Attributed(/Users/uqiu/.sbt/boot/scala-2.10.6/lib/scala-library.jar), Attributed(/Users/uqiu/.ivy2/cache/ch.qos.logback/logback-classic/jars/logback-classic-1.0.13.jar), Attributed(/Users/uqiu/.ivy2/cache/ch.qos.logback/logback-core/jars/logback-core-1.0.13.jar), Attributed(/Users/uqiu/.ivy2/cache/org.slf4j/slf4j-api/jars/slf4j-api-1.7.5.jar))
[success] Total time: 0 s, completed Apr 4, :03 PM
& show internalDependencyClasspath
[info] List()
[success] Total time: 0 s, completed Apr 4, :10 PM
这里我们没有定义子项目, 所以 internalDependencyClasspath 为空, dependencyClasspath 和
externalDependencyClasspath 是一样的.
一般来说我们关心的是 externalDependencyClasspath 的内容, 上面显示的是 List[Attribute[String]] 类型的内容, 为了可读性, 可以用 Shell 脚本或自定义 sbt 任务来格式化显示它.
Shell 脚本显示, 在项目目录下创建 dependencies.sh, 内容如下:
#!/bin/bash
echo "Direct dependencies"
sbt 'show all-dependencies' | gawk 'match($0, /List\((.*)\)/, a) {print a[1]}' | tr -d ' ' | tr ',' '\n' | sort -t ':' | \
tr ':' '\t' | expand -t 30
echo -e "\nAll dependencies, including transitive dependencies"
sbt 'show managed-classpath' | tr -d ' ' | tr ',' '\n' | gawk 'match($0, /Attributed\((.*)\)/, a) {print a[1]}' | \
tr -d '()' | sed "s^$HOME/.ivy2/cache/^^g" | sed "s^/jars^^" | \
gawk -F / '{print $1, $3}' | sort | tr ' ' '\t' | expand -t 30
Mac 下虽安装 gawk, 可用命令
brew install gawk 安装, 并用 chmod +x dependencies.sh 加上可执行属性, 完整命令如下:
brew install gawk
chmod +x dependencies.sh
./dependencies.sh
显示结果大致如下:
Direct dependencies
ch.qos.logback
logback-classic
optional(default)
optional(default)
org.scala-lang
scala-compiler
scala-tool-&default
org.scala-lang
scala-library
org.scala-lang
scala-library
scala-tool-&default
All dependencies, including transitive dependencies
ch.qos.logback
logback-classic-1.0.13.jar
ch.qos.logback
logback-core-1.0.13.jar
slf4j-api-1.7.5.jar
自定义 sbt 任务, 在 build.sbt 中加入如下内容:
本文原始链接 http://unmi.cc/show-sbt-dependency-tree/, 来自 隔叶黄莺 Unmi Blog
lazy val versionReport = TaskKey[String]("version-report")
// Add this setting to your project.
versionReport &&= (externalDependencyClasspath in Compile, streams) map {
(cp: Seq[Attributed[File]], streams) =&
val report = cp.map {
attributed =&
attributed.get(Keys.moduleID.key) match {
case Some(moduleId) =& "%40s %20s %10s %10s".format(
moduleId.organization,
moduleId.name,
moduleId.revision,
moduleId.configurations.getOrElse("")
// unmanaged JAR, just
attributed.data.getAbsolutePath
}.mkString("\n")
重新运行 sbt 或 reload 之后执行 versionReport 任务, 输出如下:
& versionReport
[info] /Users/uqiu/test/lib/guava-18.0.jar
org.scala-lang
scala-library
ch.qos.logback
logback-classic
ch.qos.logback
logback-core
这能让我们看到所有的依赖, 但并未显示成树状关系图, 还没有达到本文标题所称的目标, 所以终极办法也是最简单的办法就是不重新发明轮子, 使用现有的插件 /jrudolph/sbt-dependency-graph.
sbt 插件显示依赖树
可以在 ~/.sbt/0.13/plugins/plugins.sbt 或项目中新建 project/plugins.sbt 中加入行
addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.8.2")
这时在 sbt 的控制台下就增加了好多任务,
dependencyTree: Shows an ASCII tree representation of the project's dependencies
dependencyBrowseGraph: Opens a browser window with a visualization of the dependency graph (courtesy of graphlib-dot + dagre-d3).
dependencyGraph: Shows an ASCII graph of the project's dependencies on the sbt console
dependencyList: Shows a flat list of all transitive dependencies on the sbt console (sorted by organization and name)
whatDependsOn &organization& &module& &revision&: Find out what depends on an artifact. Shows a reverse dependency tree for the selected module.
dependencyLicenseInfo: show dependencies grouped by declared license
dependencyStats: Shows a table with each module a row with (transitive) Jar sizes and number of dependencies
dependencyGraphMl: Generates a .graphml file with the project's dependencies to target/dependencies-&config&.graphml. Use e.g. yEd to format the graph to your needs.
dependencyDot: Generates a .dot file with the project's dependencies to target/dependencies-&config&.dot. Use graphviz to render it to your preferred graphic format.
ivyReport: let's ivy generate the resolution report for you project. Use show ivyReport for the filename of the generated report
我比较感兴趣的是 dependencyTree(显示像
dependency:tree 那样) 和 dependencyBrowseGraph(打开浏览器显示一个依赖关系图)
& dependencyTree
[info] default:test_2.10:0.1-SNAPSHOT [S]
+-ch.qos.logback:logback-classic:1.0.13
+-ch.qos.logback:logback-core:1.0.13
+-org.slf4j:slf4j-api:1.7.5
[success] Total time: 0 s, completed Apr 5, :53 AM
或者执行 dependencyBrowseGraph 后打开一个浏览器
还有 dependencyGraph 任务输出为文本图形, dependencyDot 能生成 dot 文件, 等等.
用 sbt-dependency-graph 插件的办法是最强大也是最简单, 而且如果在 ~/.sbt/0.13/plugins/plugins.sbt 加载该插件更可谓是一劳永逸的做法.
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索cache
sbt添加依赖、sbt 下载依赖、sbt 打包 依赖jar包、build.sbt 添加依赖、sbt依赖,以便于您获取更多的相关知识。
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
开发者常用软件,超百款实用软件一站式提供
云栖社区()为您免费提供相关信息,包括
的信息,还有sbt添加依赖、sbt 下载依赖、sbt 打包 依赖jar包、build.sbt 添加依赖、sbt依赖等
,所有相关内容均不代表云栖社区的意见!sbt 里面使用多个项目 Muti-Project
时间: 13:00:04
本文介绍了怎样在一个 build里面构建多个项目。
在阅读本文之前,首先请读一下前面的开始指南,尤其是需要了解一下 build.sbt 和 .scala build definition。
Mutiple projects
它可以在一个 build 里面构建多个相关的项目,如果它们互相依赖并且你想在一起编辑它们,那就在好不过了。
build 里的每一个 sub-project 都有它自己的 src/main/scala,当你运行 package的时候会生成自己的 jar 文件,就像其它项目一样。
在 .scala 文件里定义项目
为了使用 multiple project ,你必须在一个.scala 文件里声明每一个项目并且描述它们之间的联系。这在 .sbt文件里是无法做到的。不管怎样,你可以在 .sbt文件里为每一个项目定义配置,下面是一个 定义了一个根工程 hello 的.scala文件的例子,这个根项目一共有两个 sub-projects,hello-foo 和 hello-bar:
import sbt._
import Keys._
object HelloBuild extends Build {
lazy val root = Project(id = &hello&,
base = file(&.&)) aggregate(foo, bar)
lazy val foo = Project(id = &hello-foo&,
base = file(&foo&))
lazy val bar = Project(id = &hello-bar&,
base = file(&bar&))
sbt使用反射技术来找到 Project 对象的列表的,进而在 Build 对象里寻找 Project 字段。
因为 hello-foo 对象通过 base = file(&foo&) 来定义,所以它包含一个 foo 的子路径。它的源文件可以在 foo 下面的路径里找到,比如 foo/Foo.scala,或者 /foo/src/main/scala。通过 build 定义文件可以看出,在 foo 下面有 sbt 默认目录结构。
foo 里面的所有的 .sbt 文件,也就是 foo/build.sbt ,将会并入到整个构建的构建定义里,但是不会在 hello-foo 工程里。
如果你的整个工程都在 hello 里,尝试着在 hello/build.sbt ,hello/foo/build.sbt 以及 hello/bar/build.sbt 里面定一个不同的版本(version :=&0.6&)。然后在sbt 控制台键入 show version。你会得到像这样的结果(取决与你定义的版本):
& show version
[info] hello-foo/*:version
[info] hello-bar/*:version
[info] hello/*:version
hello-foo/&的版本定义在 hello/foo/build.sbt 里面,hello-bar/&的版本定义在 hello/bar/build/sbt 里面,hello/&的版本定义在 hello/build.sbt 里面。记住每个语法的范围的 keys(Scopes.html)。每个 version key 对应着项目的一个基于 build.sbt 的范围。但是所有的 build.sbt
都是 build 定义的一部分。
每一个工程的设置都可以在 工程的根目录里面的 sbt 文件里进行配置,就像上面的例子那样,使用 .scala 文件同样也会很简洁的列出了项目以及基本的目录,但是没有必要把配置都放到 .scala 文件里面。
你可能会觉的把一切东西包括配置都放在 .scala 文件里很干净,因为保持了所有的构建定义仅用了一个 project 路径就完成了。好吧,一切随你。
不能在 sub-projects 里面在加一个 project 子路径,那样的话 foo/project/Build.scala 会被忽略的。
如果你愿意,项目的构建和另一个完全相互独立。
在上面的例子里,你可能注意到了 aggregate(foo,bar) 方法。它把 hello-foo 和 hello-bar 都放在了根路径下。
集成意味着在一个集成的工程里面运行任务的同时运行这个集成的工程。这个例子里我们用 sbt 启动两个子项目,并尝试编译。你将会看到三个项目都被编译了。
在根项目 hello 里在集成项目,你可以控制每一个任务。
aggregate in update := false
aggregate in update 是描述更新任务的范围的全局量,见 scopes。
注意:在没有定义顺序的情况下,项目会按照字母排列顺序运行。
Classpath 依赖
一个项目可能会依赖其它的项目。调用 dependsOn 方法来实现。例如,如果 hello-foo 需要使用 classpath里面有 hello-bar 的类,你可以在你的 Build.scala 里面这样写。
lazy val foo = Project(id = &hello-foo&,
base = file(&foo&)) dependsOn(bar)
现在 hello-foo 可以使用 hello-bar 里面的类了。它还会在编译它们的时候创建一个顺序:hello-bar 必须在hello-foo 编译之前更新编译。
为了更方便的使用于mutiple projects,在dependsOn 里面可以使用多个参数,如 dependsOn(bar,baz)。
依赖里面classpath的每一个配置
foo dependsOn(bar) 意味着 foo 里面的 Compile 配置依赖于bar 里面的 Compile 配置。 你也可以这样写 dependsOn(bar % &compile-&compile&)。
compile-&compile 里面的 -& 意味着依赖于,所以 test-&compile 意味着 Test 里面的 foo 配依赖于 bar 里面的编译配置。
省略的 -&config 部分意味着 -&compile, 因此 dependsOn(bar % &test&) 意味着foo 里面的 Test 配置bar 里面的 Compile 配置。
一个有用的写法是 test-&test,意味着 Test 依赖于 Test。比如,它允许你在 bar/src/test/scala 里面测试代码,接着又在 foo/src/test/scala 里面测试。
在sbt 控制台提示符下输入 projects 来列出有的工程,输入 project&来选择一个做为当前的工程。当你运行像 compile
你可以在一个依赖里面使用多个配置,使用分号分隔。例如,&dependsOn(bar % &test-&compile-&compile&).
Navaigating 项目的集成
在 sbt 控制台输入 project 来列出你所有的项目,project&来选择一个当前使用的项目。当你使用类似 compile 的命令时,是在当前项目里执行的。所以你不必编译根项目,你只需要在一个子项目里 compile。
当在不同的项目里面使用一个 .scala 配置文件时,在不同的项目中间重用配置是很方便的。但是即使是使用不同的 buid.sbt 配置文件,在 main build 里面使用共享的配置依然很方便,只需要对相应的配置使用 ThisBuild 来把它应用的全局范围。例如,当 main 项目依赖于一个子项目时,为了这两个项目使用同一个版本的Scala 来编译。可以在 build.sbt 文件里面这样写一次:
scalaVersion in ThisBuild := &2.10.0&
把 2.20.0 替换成相应的 Scala 版本。这个设置会在所有的子项目里面生效。也可以在 “page on scope ”Thisbuild 处获得更多信息。
继续学习自定义配置。
$T.total > 0 && $T.page <= $T.pageNum}
{#foreach $T.data as r}
{$T.r.formt_tm}{#if $T.r.nickname}{#else}匿名{#/if}
{$T.r.content}
{#if $T.page > 1 && $T.pageNum > 1)
$T.s_num > 2}
{#for index = $T.s_num to $T.e_num}
$T.pageNum > $T.pageNavSize+ 2 && $T.s_num != $T.pageNum - $T.pageNavSize}
{#if $T.pageNum > 1}
{#if $T.pageNum != $T.page && $T.pageNum > 1}
<a href="javascript:void(0);" page="{$T.page 下一页
您的回应...
也许你感兴趣
(window.slotbydup=window.slotbydup || []).push({
id: '3465635',
container: s,
size: '120,240',
display: 'float'
(C)2012 本站提供的内容来源于广大网络用户,我们不保证内容的正确性。如果转载了您的内容,希望删除的请联系我们!sbt从入门到半熟 - beike - ITeye博客
博客分类:
zt /blog//2.html
SBT = (not so) Simple Build Tool,是scala的构建工具,与java的maven地位相同。其设计宗旨是让简单的项目可以简单的配置,而复杂的项目可以复杂的配置。。。
是我配置好的一个sbt项目,已经配置好了单元测试框架specs2,log引擎logback,slf4j,和eclipse项目生成插件sbteclipse,拿来改改就可以用,单元测试覆盖率工具由于版本未跟上sbt新版本因此暂时不能用,过一阵会更新上。建议读者先checkout这个项目再继续往下读,以便随时可以做做实验。
sbt项目的目录规约和maven一样,sbt有约定了一个通用的目录结构,使用约定的结构会使后面的工作简单很多。base/
//构建配置文件
//也是构建配置的一部分
/build.scala
//高级配置,可选
/resources
/resourcesbase代表项目的根目录项目配置可以在build.sbt文件里定义,也可以在base/project/build.scala文件里定义,一般情况下build.sbt就已经足够,除非多工程项目或者需要很多特殊定义的项目
常用命令在我读完sbt的getting started文档之前,我也经常有疑问:为什么scala不沿用maven,而要搞出sbt这么个(not so simple) Simple Build Tool ?在读完文档,并实际操作后,我现在感觉确实是物有所值的。checkout 我的sbtTemple项目后,进入命令行,进入到项目根目录,输入sbt回车进入sbt交互模式sbt有哪些命令可用?输入help命令查询,即会列出一堆可用的命令,比如exit,reload等,不知道某个命令的作用?help 命令名,比如输入help exit显示exit命令的作用。 列出的命令里并没有compile,test等常用的命令?因为那些不是sbt的命令而是当前工程的task. 输入 tasks命令,就可以看见 compile,test,package等等任务的说明了。想查看项目的配置?用show命令,输入show name,看当前项目的名字,输入show libraryDependencies看当前项目依赖的库,libraryDependencies太长记不住?输入lib后按tab键! 交互窗口是有tab提示的!输入help show,你可以看到show命令的作用是显示配置的值,如果show之后跟的是任务,则执行该任务并显示任务执行的结果。 你可以试试show compile看什么结果,如果你不想执行compile,而是想看命令的说明,请用inspect命令,inspect命令比较复杂,执行后输出的结果也比较复杂,具体这个命令的作用是什么请help inspect, 不过得等理解了build definition的含义后才能看懂help说的是什么。。。常用的任务则有compile, test, run,package,doc等,请顾名思义或自行help之。另外这些任务常常还有些变种,比如package-doc,package-src等,用tasks命令查看任务的列表,必有一款适合您有一个强大的任务不得不特别拎出来说一下:console输入console回车,会在当前会话内启动一个REPL,不要告诉我你不知道REPL是scala解释器的意思。。。就是你在命令行下输入scala回车后进入的那个交互界面。强大的是,sbt会加载你的项目依赖的全部jar包和你自己的代码! 你可以在这个解释器里实验你的半成品。 我的模板工程里有一个sample/Account.scala文件,十几行很简单的代码,你可以看一下,然后在console窗口里玩弄Account类和Account伴生对象.
不过别忘了先import sample._因为依赖的jar包也都被加载了,所以对于那些你可能还不熟悉的第三方库,你有可以在console里玩个痛快!这功能很给力,谁用谁知道。顺便在提一下,sbt命令有3种执行模式:1、交互式,即上文所描述的2、批处理式,即在命令行下输入sbt 命令名来执行,比如sbt compile就会编译代码,而不进入交互模式3、连绵不绝式,在命令名前加上~号,即会进入连绵不绝模式,比如~compile,会编译当前代码,然后监听代码改变,每当你编辑了代码并保存后,sbt就会自动编译代码,~test也一样,当你修改代码后自动编译并运行单元测试。按回车键可退出此模式。
build definition释义你前面应该试过show name和show libraryDependencies了吧?show出来的结果就是来自你的build.sbt文件,也就是build definition了。打开build.sbt就可以看到name := "sbt11template"
还有其他的一堆xxx := xxxx,很显然的,这就是个key-value pair,
sbt就是读取配置文件并构建一个key-value的map. 但是在build.sbt里面并非key := value, 而是key := expression. 文件里的每一行其实是一句scala语句,不行你可以试试把name := "sbt11template" 改成name := {"sbt11template".toUpperCase} 然后reload,
再show name,你会看到变成大写的SBT11TEMPLATE:=是最常用的方法,其作用就是将key设置成expression的值,相同的key如果被多次赋值,则后面的值会覆盖掉前面的值。适用于简单类型的key,比如name,version等。其他的常用方法有+=,将值添加进现有值里,适用于集合类型的key,比如libraryDependencies++=,将一个集合值加入当前集合里~= ,。。这个牛X,你在~=后面写个函数,~=将key的当前值传给你的函数,然后将函数结果作为新值,比如你可以在name := xxx后面再来一句 name ~= { _. toUpperCase },一样是把name变成大写&&= 将另一个key的值赋给当前key,比如auther &&= name ,这个方法还有个高级用法,你可以组合多个其他key的值,赋给当前key,用文档里的例子name &&= (name, organization, version) { (n, o, v) =& "project " + n + " from " + o + " version " + v }
还有适用于集合类型的版本&+= 和 &++=这些语法的官方文档在此
依赖管理对于不打算通过官方repository管理的第三方库,在项目目录下建个lib目录,把jar包扔进去就行了。希望sbt待为管理的则在build.sbt里用下面的语法加入libraryDependencies += groupID % artifactID % revision % configuration% configuration是可选的,表示某依赖库只在特定配置中需要,比如模板项目里的"org.specs2" %% "specs2" % "1.7.1" % "test" 是单元测试框架,只在测试时需要。如果你视力好,会看到其中有个 %%,而不是一个%,这表示要求sbt寻找用当前你配置的scala版本编译出来的jar包,这是因为scala不同版本编译出来的结果会不兼容(悲剧),希望以后scala社区会解决这不兼容的问题。。。对于依赖的java语言写的库的jar包,就没这问题了,比如libraryDependencies += "org.slf4j" % "slf4j-api" % "1.6.4" 就不需要%%了配置好依赖后,运行sbt update,sbt会自动到maven库和scala官方库里去找这些jar包并下载到你的用户目录的.ivy2目录里面,如果你不同的项目用了相同的库,则sbt下载一次就够了。如果你希望sbt从你自己配置的repository里下载,使用这个语法:resolvers += name at location
比如resolvers += "Scala-Tools Maven2 Snapshots Repository" at "http://scala-tools.org/repo-snapshots"所有的一切都是通过key类配置的,key 的列表在
慢慢看吧。。。
sbt插件现有的sbt插件的列表在
安装的方法各有不同,请自己查阅我的项目模板里已经配置了sbteclipse插件,运行sbt eclipse或在交互模式下输入eclipse回车即会生成相应的eclipse项目文件,然后你就可以在eclipse里用import
existing projects into workspace来导入了。
高级配置高级配置显然不是半熟的我能搞定的东西。。。全文结束,未在文中讲解的内容有scopes(), 插件的本质和开发(), 多工程项目(), 自定义Setting和任务(),有兴趣的请猛击链接,自行学习
浏览 23791
浏览: 277615 次
如果不是在git本地版本目录中执行的话,会有问题。到本地版本目 ...
阿撒旦发撒旦发速度飞洒发
感谢,楼主的详细分析,对我的启发很大。。我也正在研究这方面的技 ...

我要回帖

更多关于 黑暗中的使徒卢克任务 的文章

 

随机推荐