在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 物聯(lián)網(wǎng)/ Lib 庫依賴
目錄結(jié)構(gòu)
Linux 平臺安裝 SBT
總結(jié)
安裝 SBT
簡單例子:Hello World
多項目構(gòu)建
作用域
配置文件 .sbt
Lib 庫依賴
運行 SBT
Windows 平臺安裝 SBT
插件使用
Mac 平臺安裝 SBT
配置文件 .scala
配置參數(shù)的方法
手動安裝 SBT
自定義配置和任務(wù)

Lib 庫依賴

添加Lib庫依賴關(guān)系有兩種方式:

  • 非管理依賴方式,是通過將依賴的Jar包放到項目的lib目錄
  • 管理依賴方式,是在工程構(gòu)建配置中配置依賴關(guān)系,sbt會自動從托管代碼庫中下載依賴庫

非管理依賴方式

很多人用管理依賴的方式替代非管理方式,其實非管理方式用起來非常方便。非管理依賴方式的工作原理就是將jar包放到lib目錄下,sbt會自動的將其添加到classpath中。也可以將一些測試依賴放到lib目錄下,如ScalaCheckSpecs2ScalaTest這些依賴包

lib目錄下載的依賴在所有的classpath中有效(對于編譯、測試、運行或命令終端),如果想修改某個配置維度的作用域的classpath配置,需要按照如下修改方式dependencyClasspath in CompiledependencyClasspath 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方式管理依賴包,如果熟悉IvyMaven的話,理解sbt的管理依賴包將會非常的容易。

libraryDependencies 參數(shù)配置

一般情況下只需要通過配置libraryDependencies參數(shù)配置即可設(shè)置依賴的包,也可以通過編寫Maven的POM配置文件或Ivy的配置文件來擴展包依賴的功能。

以下是申明一個包依賴關(guān)系, 其中groupId,artifactIdrevision是字符串類型

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ù)情況下可能也會用到:=賦值方法

指定依賴庫Scala版本

如果用 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)用%%是獲取不到依賴包的,這時需要確定該版本的依賴包是否可用,并且可以通過硬編碼版本的方式添加依賴

Ivy 自動匹配版本

在配置groupID % artifactID % revisionrevision不是一定要指定一個固定的版本號,Ivy 可以自動選擇一個高版本包根據(jù)指定的限定條件,例如如果要替換一個固定版本"1.6.1",可以通過指定"latest.integration","2.9.+"或"[1.0,)"來替換,更多的配置請參看Ivy配置文檔

遠(yuǎn)程依賴庫地址管理

不是所有的包在同一個遠(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

重寫默認(rèn)的遠(yuǎn)程依賴庫

參數(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、Specs2ScalaTest將指定% "test"來限定在Test配置維度下使用。