sbt 啟動器是一種機制,可讓模組從 Ivy 中載入並在 JVM 中執行。 它抽象化了抓取和快取 jar 的機制,讓使用者可以專注於他們想要的應用程式,並控制其版本。
啟動器的主要目標是取得應用程式的組態(主要是 Ivy 坐標和主類別),然後啟動應用程式。 啟動器會解析 Ivy 模組、快取所需的執行階段 jar,然後啟動應用程式。
sbt 啟動器提供應用程式在完成時載入不同應用程式、正常結束或從另一個應用程式內部載入其他應用程式的方式。
sbt 啟動器提供以下核心功能
sbt 啟動器的主要目的是解析應用程式並執行它們。 這是透過 [app]
組態區段完成的。 如需如何組態模組解析的詳細資訊,請參閱 [啟動器組態][Launcher-Configuration]。
模組解析是使用 Ivy 相依性管理函式庫執行的。 這個函式庫也支援從 Maven 儲存庫載入成品。
sbt 啟動器的類別載入結構與僅使用標準 Java 機制啟動應用程式不同。 啟動器載入的每個應用程式都會獲得自己的類別載入器。 此類別載入器是應用程式使用的 Scala 類別載入器的子類別。 Scala 類別載入器可以看到啟動器本身的所有 xsbti.*
類別。
以下是從 sbt 啟動的應用程式的類別載入器版面配置範例。
在此圖表中,載入了三個不同的應用程式。 其中兩個使用相同版本的 Scala (2.9.2)。 在這種情況下,sbt 可以為這些應用程式共用相同的類別載入器。 這有一個好處,就是對 Scala 類別執行的任何 JIT 優化,都可以透過共用類別載入器在應用程式之間重複使用。
sbt 啟動器會在 Ivy 自己的快取之上建立第二個快取。 這有助於將應用程式與不穩定修訂版本(例如 -SNAPSHOT
)造成的錯誤隔離。 對於任何已啟動的應用程式,啟動器都會建立一個目錄來儲存其所有 jar。 以下是一個版面配置範例。
除了提供第二個快取之外,啟動器還提供安全執行檔案型鎖定的機制。 啟動器直接在兩個地方使用此機制
此功能需要支援鎖定的檔案系統。 它透過 xsbti.GlobalLock
介面公開。
啟動器還提供一種機制,可確保只有一個伺服器執行個體在執行,同時在用戶端請求時動態啟動它。 這是透過啟動器上的 --locate
旗標完成的。 當啟動器使用 --locate
旗標啟動時,它會執行下列動作
因此,已組態的 server.lock
檔案會用於防止多個伺服器執行。 sbt 本身會使用它,方法是將 server.lock
組態為 ${user.dir}/.sbtserver
,以防止在任何給定的專案目錄上執行多個伺服器。