1. 類別路徑

類別路徑 

在類別路徑中包含一種新的受管理成品類型,例如 mar 

classpathTypes 設定控制預設包含在類別路徑中的受管理成品類型。要新增一種新類型,例如 mar

classpathTypes += "mar"

取得用於編譯的類別路徑 

透過在 sbt 提示字元中執行 show classpathTypes,查看預設包含的類型。

範圍設定為 CompiledependencyClasspath 任務提供用於編譯的類別路徑。其類型為 Seq[Attributed[File]],這表示每個條目都攜帶額外的元數據。 files 方法僅為類別路徑提供原始的 Seq[File]。例如,要在另一個任務中使用編譯類別路徑的檔案,

example := {
  val cp: Seq[File] = (Compile / dependencyClasspath).value.files
  ...
}

注意:此類別路徑不包含類別目錄,在某些情況下,編譯可能需要此目錄。

取得執行階段類別路徑,包括專案的已編譯類別 

fullClasspath 任務提供一個類別路徑,其中包含相依性和專案的產出。對於執行階段類別路徑,這表示專案的主要資源和已編譯類別以及所有執行階段相依性。

類別路徑的類型為 Seq[Attributed[File]],這表示每個條目都攜帶額外的元數據。 files 方法僅為類別路徑提供原始的 Seq[File]。例如,要在另一個任務中使用執行階段類別路徑的檔案,

example := {
  val cp: Seq[File] = (fullClasspath in Runtime).value.files
  ...
}

取得測試類別路徑,包括專案的已編譯測試類別 

fullClasspath 任務提供一個類別路徑,其中包含相依性和專案的產出。對於測試類別路徑,這包括專案的主要和測試資源以及已編譯類別,以及所有用於測試的相依性。

類別路徑的類型為 Seq[Attributed[File]],這表示每個條目都攜帶額外的元數據。 files 方法僅為類別路徑提供原始的 Seq[File]。例如,要在另一個任務中使用測試類別路徑的檔案,

example := {
  val cp: Seq[File] = (Test / fullClasspath).value.files
  ...
}

在類別路徑上使用封裝的 jar,而不是類別目錄 

預設情況下,fullClasspath 包含一個目錄,其中包含專案的類別檔案和資源。反過來說,這表示 compiletestrun 等任務在其類別路徑上具有這些類別目錄。要改為使用封裝的成品(例如 jar),請設定 exportJars

exportJars := true

這將在類別路徑上使用 packageBin 的結果,而不是類別目錄。

注意:具體來說,fullClasspath 是 dependencyClasspath 和 exportedProducts 的串聯。當 exportJars 為 true 時,exportedProducts 是 packageBin 的輸出。當 exportJars 為 false 時,exportedProducts 只是產品,預設情況下,該產品是包含類別檔案和資源的目錄。

取得組態的所有受管理 jar 

update 任務的結果具有 UpdateReport 類型,其中包含相依性解析的結果。這可用於提取特定組態中特定類型成品的檔案。例如,要取得 Compile 組態中相依性的 jar 和 zip,

example := {
   val artifactTypes = Set("jar", "zip")
   val files =
      Classpaths.managedJars(Compile, artifactTypes, update.value)
   ...
}

取得類別路徑中包含的檔案 

類別路徑的類型為 Seq[Attributed[File]],這表示每個條目都攜帶額外的元數據。 files 方法僅為類別路徑提供原始的 Seq[File]。例如,

val cp: Seq[Attributed[File]] = ...
val files: Seq[File] = cp.files

取得產生類別路徑項目的模組和成品 

類別路徑的類型為 Seq[Attributed[File]],這表示每個條目都攜帶額外的元數據。此元數據的形式為 AttributeMap。地圖中條目的有用索引鍵為 artifact.keymoduleID.keyanalysis。例如,

val classpath: Seq[Attributed[File]] = ???
for(entry <- classpath) yield {
   val art: Option[Artifact] = entry.get(artifact.key)
   val mod: Option[ModuleID] = entry.get(moduleID.key)
   val an: Option[inc.Analysis] = entry.get(analysis)
   ...
}

注意:條目可能沒有部分或所有元數據。只有來自原始碼相依性(例如內部專案)的條目才具有增量編譯 Analysis。只有受管理相依性的條目才具有 ArtifactModuleID