添加Lib庫(kù)依賴關(guān)系有兩種方式:
很多人用管理依賴的方式替代非管理方式,其實(shí)非管理方式用起來非常方便。非管理依賴方式的工作原理就是將jar包放到lib目錄下,sbt會(huì)自動(dòng)的將其添加到classpath中。也可以將一些測(cè)試依賴放到lib目錄下,如ScalaCheck、Specs2和ScalaTest這些依賴包
lib目錄下載的依賴在所有的classpath中有效(對(duì)于編譯、測(cè)試、運(yùn)行或命令終端),如果想修改某個(gè)配置維度的作用域的classpath配置,需要按照如下修改方式dependencyClasspath in Compile 或 dependencyClasspath in Runtime
對(duì)于非管理方式的依賴不需要在build.sbt額外配置,但是如果想自定義一個(gè)依賴目錄而不是默認(rèn)的lib目錄時(shí),可以通過修改unmanagedBase參數(shù)配置, 比如用目錄custom_lib替換lib目錄
unmanagedBase := baseDirectory.value / "custom_lib"
其中baseDirectory是項(xiàng)目的根目錄,修改unmanagedBase參數(shù)配置依賴baseDirectory,關(guān)于參數(shù)配置的依賴可以參考配置參數(shù)的方法
在非管理依賴方式中還提供了一個(gè)任務(wù)配置unmanagedJars用來列舉unmanagedBase所有的jar包的,在多項(xiàng)目構(gòu)建中或更加復(fù)雜的構(gòu)建中可能需要修改unmanagedJars配置來完成。例如,在Compile這個(gè)配置維度作用域下要清空所有非管理方式的jar包,可以利用如下配置:
unmanagedJars in Compile := Seq.empty[sbt.Attributed[java.io.File]]
sbt 利用Apache Ivy方式管理依賴包,如果熟悉Ivy或Maven的話,理解sbt的管理依賴包將會(huì)非常的容易。
libraryDependencies 參數(shù)配置一般情況下只需要通過配置libraryDependencies參數(shù)配置即可設(shè)置依賴的包,也可以通過編寫Maven的POM配置文件或Ivy的配置文件來擴(kuò)展包依賴的功能。
以下是申明一個(gè)包依賴關(guān)系, 其中groupId,artifactId和revision是字符串類型
libraryDependencies += groupID % artifactID % revision
或用如下申明,其中configuration是一個(gè)字符串或者一個(gè)配置維度實(shí)例
libraryDependencies += groupID % artifactID % revision % configuration
libraryDependencies這個(gè)配置key在Keys中聲明語(yǔ)句如下
val libraryDependencies = settingKey[Seq[ModuleID]]("Declares managed dependencies.")
從上述 libraryDependencies key 申明語(yǔ)句中可以看出其值是接收一個(gè)由ModuleID對(duì)象構(gòu)成的序列。在申明依賴關(guān)系的語(yǔ)句中有%方法,該方法是用字符串創(chuàng)建一個(gè)ModuleID類型的對(duì)象。
當(dāng)然sbt必須知道所配置的依賴庫(kù)到什么地方下載,如果配置的依賴庫(kù)在默認(rèn)的遠(yuǎn)程庫(kù)中存在將直接下載,比如Apache Derby就是在標(biāo)準(zhǔn)遠(yuǎn)程庫(kù)Maven2中:
libraryDependencies += "org.apache.derby" % "derby" % "10.4.1.3"
如果配置到build.sbt 并且執(zhí)行update, sbt將自動(dòng)將其下載到~/.ivy2/cache/org.apache.derby/目錄下(由于compile任務(wù)配置會(huì)依賴update這個(gè)任務(wù),所以一般情況不用手動(dòng)執(zhí)行update)
當(dāng)然,也可以用 ++= 方法一次性添加一個(gè)依賴列表:
libraryDependencies ++= Seq(
groupID % artifactID % revision,
groupID % otherID % otherRevision
)
在少數(shù)情況下可能也會(huì)用到:=賦值方法
如果用 groupID %% artifactID % revision而不是groupID % artifactID % revision 方式配置依賴關(guān)系(二者區(qū)別在于前者的groupId后的是兩個(gè)%), sbt將會(huì)添加當(dāng)前scala版本到依賴的報(bào)名后,這個(gè)只是一個(gè)快捷的方式,你也可以直接硬編碼scala版本:
libraryDependencies += "org.scala-tools" % "scala-stm_2.11.1" % "0.3"
假如當(dāng)前構(gòu)建項(xiàng)目的scalaVersion為2.11.1,如下方式和上述的結(jié)果是一樣(利用%%方式添加依賴庫(kù)的Scala版本)
libraryDependencies += "org.scala-tools" %% "scala-stm" % "0.3"
在多個(gè)Scala版本下構(gòu)建項(xiàng)目,可以使用這種方法來匹配二進(jìn)制兼容的對(duì)應(yīng)依賴包。
復(fù)雜的情況是經(jīng)常有依賴包對(duì)于不同的Scala版本間有細(xì)微的差別,所以如果依賴包在2.10.1版本下存在,但是當(dāng)前項(xiàng)目scalaVersion := "2.10.4", 將會(huì)發(fā)現(xiàn)用%%是獲取不到依賴包的,這時(shí)需要確定該版本的依賴包是否可用,并且可以通過硬編碼版本的方式添加依賴
在配置groupID % artifactID % revision 中revision不是一定要指定一個(gè)固定的版本號(hào),Ivy 可以自動(dòng)選擇一個(gè)高版本包根據(jù)指定的限定條件,例如如果要替換一個(gè)固定版本"1.6.1",可以通過指定"latest.integration","2.9.+"或"[1.0,)"來替換,更多的配置請(qǐng)參看Ivy配置文檔
不是所有的包在同一個(gè)遠(yuǎn)程庫(kù)中都存在,sbt默認(rèn)用的是標(biāo)準(zhǔn)的Maven2遠(yuǎn)程庫(kù),如果依賴的包不在默認(rèn)的遠(yuǎn)程庫(kù)中,需要手動(dòng)指定一個(gè)遠(yuǎn)程庫(kù)供Ivy查找。
添加遠(yuǎn)程庫(kù)的方法如下:
resolvers += name at location
例如:
resolvers += "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots"
resolvers 這個(gè)配置項(xiàng)在 Keys中的定義如下:
val resolvers = settingKey[Seq[Resolver]]("The user-defined additional resolvers for automatically managed dependencies.")
在添加遠(yuǎn)程庫(kù)配置語(yǔ)句中的 at 方法是將字符串轉(zhuǎn)化為Resolver對(duì)象。
sbt 也支持搜索本地的Maven依賴庫(kù),配置如下:
resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"
也可以簡(jiǎn)寫為:
resolvers += Resolver.mavenLocal
參數(shù)配置resolvers中是不包含默認(rèn)的遠(yuǎn)程庫(kù)配置的,僅僅用來配置添加遠(yuǎn)程庫(kù)地址,sbt 最終是通過合并resolvers配置和externalResolvers配置來得到遠(yuǎn)程庫(kù)地址集合,所以如果要修改默認(rèn)遠(yuǎn)程庫(kù)的話需要修改參數(shù)配置externalResolvers
經(jīng)常在測(cè)試代碼中會(huì)用到依賴庫(kù)(在src/test/scala目錄中的代碼將通過配置維度為Test作用域的配置來編譯)但在項(xiàng)目代碼中不會(huì)用到。
如果只想在編譯測(cè)試代碼的時(shí)候加入到classpath而在編譯項(xiàng)目代碼的時(shí)候不加入,可以通過添加% "test"指定配置維度的作用域來限定:
libraryDependencies += "org.apache.derby" % "derby" % "10.4.1.3" % "test"
也可以指定配置維度的一個(gè)實(shí)例對(duì)象來限定:
libraryDependencies += "org.apache.derby" % "derby" % "10.4.1.3" % Test
那么,當(dāng)限定到某個(gè)配置維度作用域時(shí)利用命令show compile:dependencyClasspath查看配置時(shí)將不會(huì)看到derbyjar包,但是如果查看show test:dependencyClasspath將會(huì)看到derby jar包在列表中。
常見的,測(cè)試相關(guān)的包ScalaCheck、Specs2和ScalaTest將指定% "test"來限定在Test配置維度下使用。