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