类库依赖可以通过两种方式添加:
非托管依赖
大多数人使用托管依赖代替非托管依赖。但用非托管可以更简单地开始。
在lib中的依赖会添加到所有classpath中(compile,test,run和console)。如果你想改变其中一个的classpath,你可以调整
dependencyClasspath
in
Compile或
dependencyClasspath
in
Runtime。你可以用~=来获得先前的classpath值,过滤掉其中一些,并返回一个新的classpath值。~=更多细节见
more about settings。
用custom_lib代替lib:
unmanagedBase <<= baseDirectory { base => base / "custom_lib" }baseDirectory是项目根目录,在这里,修改后的unmanagedBase依赖于baseDirectory,<<=的用法在 more about settings。
另外,还有一个unmanaged-jars任务用来列出unmanaged-base文件夹中的jar文件。如果你想使用多个文件夹或做一些更复杂的事情,你可能需要替换整个unmanaged-jars任务来做其他事情。
托管依赖
sbt使用Apache Ivy来实现托管依赖,所以如果你熟悉Maven或Ivy,就不会有太多麻烦。
The libraryDependencies key
声明一个依赖看起来是这样的,其中groupId,artifactId和revision是字符串:
libraryDependencies += groupID % artifactID % revision或这样,其中configuration也是字符串:
libraryDependencies += groupID % artifactID % revision % configurationlibraryDependencies在Keys中是这样声明的:
val libraryDependencies = SettingKey[Seq[ModuleID]]("library-dependencies","Declares managed dependencies.")%方法从字符串创建一个ModuleID对象,然后添加这个ModuleID到libraryDependencies。
libraryDependencies += "org.apache.derby" % "derby" % "10.4.1.3"如果你在build.sbt中输入,然后update,sbt将Derby下载到~/.ivy2/cache/org.apache.derby/。(顺便说一下,update是compile的依赖,所以大部分时间不需要手动输入update。)
libraryDependencies ++= Seq( groupID % artifactID % revision,groupID % otherID % otherRevision )
在很少情况下,你也可能会找到理由来使用:=,<<=,<+=等。
用%%来获得正确的Scala版本(Getting the right Scala version with %%)
如果你使用groupID %% artifactID % revision(而不是groupID % artifactID % revision,区别在于groupID后有两个%%),sbt会将项目的Scala版本添加到artifact name。这是一个简单的例子,你可以不用%%:
libraryDependencies += "org.scala-tools" % "scala-stm_2.9.1" % "0.3"假设你的构建的scalaVersion是2.9.1,那么用下面的表达式也是一样的:
libraryDependencies += "org.scala-tools" %% "scala-stm" % "0.3"这个概念是由于很多依赖包被编译为多个Scala版本,并且你希望得到和你项目匹配的那个。
这个实践的复杂性在于,通常一个依赖包能够工作在有细微不同的Scala版本中;但%%不太智能。所以如果依赖在2.9.0中有效,但你使用scalaVersion := "2.9.1",那么你将不能使用%%,即使2.9.0依赖很可能能够工作。如果%%停止工作,就检查一下这个依赖实际上是为哪个版本构建的,并硬编码那个你认为能够工作的(假设有这么一个)。
更多细节,查看Cross-building。
Ivy revisions
groupID % artifactID % revision中的revision可以不是唯一固定的版本。Ivy可以选择模块的最后修订版本,来代替固定修订版本比如“1.6.1”,你需要指定"latest.integration","2.9.+"或"[1.0,)"。更多细节查看Ivy revisions文档。
Resolvers
resolvers += name at location
例如:
resolvers += "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots"
resolvers键在Keys中这样定义:
val resolvers = SettingKey[Seq[Resolver]]("resolvers","The user-defined additional resolvers for automatically managed dependencies.")at方法从两个字符串创建一个Resolver对象。
resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"查看 Resolvers获得更多关于定义其他资源仓库的类型的细节。
覆盖默认resolvers
sbt联合resolvers与默认资源仓库构成external-resolvers。
因此,想要改变或移除默认resolvers,你需要重写external-resolvers(代替resolvers)。
Per-configuration dependencies
libraryDependencies += "org.apache.derby" % "derby" % "10.4.1.3" % "test"现在,如果你在sbt交互提示符中输入show compile:dependency-classpath,不能看到derby。但如果你输入show test:dependency-classpath,你就能够在列表中看到derby的jar。
测试相关的依赖比如ScalaCheck,specs和ScalaTest需要用% "test"定义。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。