使用 SpringSource Application Platform 的佈建儲存庫

工程 | Andy Wilkinson | 2008 年 5 月 09 日 | ...

SpringSource Application Platform 的主要優點之一是它能夠根據需要佈建相依性。 這具有雙重好處:它確保 Platform 的記憶體佔用空間盡可能小,並且允許部署應用程式而無需將其所有相依性封裝在單一的部署單元中,例如 WAR 檔案。 為了利用這些功能,您需要了解 Platform 的佈建儲存庫,而此部落格的目的正是提供這些資訊。

佈建儲存庫在哪裡?它如何運作?

預設情況下,Platform 的佈建儲存庫位於安裝根目錄的 repository 目錄中: Directory structure of the provisioning repository 如您所見,有三個主要目錄:bundlesinstalledlibrariesinstalled 供 Platform 內部使用,因此我們將在此處重點介紹 bundleslibraries 目錄。 每個目錄都包含許多子目錄,以分隔不同類型的相依性。
  • ext 包含 Platform 提供的外部相依性,但不屬於 Platform 本身。
  • subsystems 包含組成 Platform 的所有子系統。
  • usr 最初是空的,旨在包含使用者新增的相依性,也就是您的應用程式所依賴但 Platform 尚未提供的任何內容。
Platform 在其初始啟動期間搜尋 repository 目錄結構中的套件 (bundles) 和函式庫 (libraries)。 我將在本條目稍後討論如何設定此搜尋。 當在儲存庫中找到套件和函式庫時,它們的符號名稱、匯出的套件等詳細資訊會新增到儲存庫的記憶體索引中。 完成掃描後,記憶體索引會快取到磁碟。 在開發期間,盡可能縮短 Platform 的啟動時間是我們的首要任務。 這種快取允許 Platform 在啟動期間節省一些時間:它可以跳過掃描,除非它檢測到儲存庫的內容已變更。

執行階段佈建

在普通的 OSGi 環境中,套件的相依性只能由已安裝在環境中的其他套件滿足。 例如,如果尚未安裝匯出 org.apache.commons.dbcp 套件的任何套件,則安裝並啟動匯入該套件的套件將會失敗。 這對於使用者來說可能是一個真正的麻煩,因為他們必須手動安裝套件的所有相依性。 值得慶幸的是,SpringSource Application Platform 通過根據需要動態安裝相依性來顯著改進了這一點。

當 Platform 啟動已部署的應用程式時,其套件會安裝到 Equinox 中。 然後,Platform 會要求 Equinox 提供所有套件未滿足的相依性清單,並嘗試滿足它們。 讓我們通過一個簡單的範例情境來分析這個過程

  1. Platform 將匯入 org.apache.commons.dbcp 的套件安裝到 Equinox 中。
  2. Platform 要求 Equinox 提供套件未滿足的相依性,並被告知無法滿足 org.apache.commons.dbcp 的匯入。
  3. Platform 在其佈建儲存庫的索引中搜尋匯出 org.apache.commons.dbcp 的套件
  4. Platform 將匯出 org.apache.commons.dbcp 的套件安裝到 Equinox 中
  5. 在滿足原始套件的相依性後,Platform 成功啟動了原始套件。
我們希望這將使我們使用者的生活更加輕鬆:只要您的應用程式的相依性可供 Platform 使用,您就可以簡單地部署您的應用程式並開始使用! 無需親自動手完成手動安裝應用程式所有相依性的耗時過程。 此過程的一個優點是,只有在需要時才會安裝相依性。 您可以將任意數量的套件新增到佈建儲存庫,而幾乎不會對 Platform 的記憶體佔用空間產生任何影響。

如果 Platform 無法從其儲存庫中滿足相依性,則會產生一條日誌訊息,詳細說明無法滿足的相依性。 掌握這些資訊後,您可以使用 SpringSource Enterprise Bundle Repository 來取得您需要的內容。 我們希望儲存庫提供盡可能完整的套件集:如果您需要某個相依性,但它不可用,請 告訴我們

將項目新增到佈建儲存庫

因此,您已經下載了一兩個相依性,現在想要將它們新增到 Platform。 您所需要做的就是將它們複製到儲存庫中的適當目錄。 例如,通常會將新的套件新增到 repository/bundles/usr 目錄,並且通常會將新的函式庫描述符新增到 repository/libraries/usr 目錄。

如上所述,Platform 使用在其啟動期間填充的佈建儲存庫的記憶體索引。 除此之外,Platform 還會在每次部署應用程式時檢查其儲存庫視圖是否為最新。 當您想要安裝具有新相依性的應用程式時,只需將相依性複製到儲存庫中的適當位置,然後部署您的應用程式。 在其部署過程中,Platform 將注意到儲存庫已更新,並將重新整理其視圖。 這表示您無需花費時間在每次想要安裝具有新相依性的應用程式時重新啟動 Platform。

在安裝之間共用佈建儲存庫

可以輕鬆配置 Platform 在佈建儲存庫中搜尋項目的位置,以滿足您的需求。 例如,多個 Platform 實例可以共用部分或全部佈建儲存庫,因此您無需浪費精力在 Platform 安裝之間維護重複的套件集。

可以在 config/platform.config 檔案中配置 Platform 在建立其佈建儲存庫時掃描的位置。 在沒有任何特定配置的情況下使用的預設配置是


"provisioning" : {
    "searchPaths": [ 
        "repository/bundles/subsystems/{name}/{bundle}.jar",
        "repository/bundles/ext/{bundle}",
        "repository/bundles/usr/{bundle}",
        "repository/libraries/ext/{library}",
        "repository/libraries/usr/{library}"
    ]
}

任何相對路徑都由 Platform 解釋為相對於其安裝根目錄,同時也支援絕對路徑。 大括號內的搜尋路徑中的條目只是萬用字元,例如,子系統搜尋路徑 repository/bundles/subsystems/{name}/{bundle}.jar 將在任何 subsystems 目錄的直接子目錄中尋找任何名稱以 .jar 結尾的檔案。

希望您可以看到,在 Platform 之間共用部分或全部佈建儲存庫是一項微不足道的變更。 例如,若要使 Platform 除了在它自己的 subsystemsext 目錄中之外,還搜尋檔案系統根目錄中名為 shared-bundles 的目錄,您所需要做的就是將以下 JSON (JavaScript Object Notation) 片段新增到 platform.config 檔案中


"provisioning" : {
    "searchPaths": [
        "repository/bundles/subsystems/{name}/{bundle}.jar",
        "repository/bundles/ext/{bundle}",
        "/shared-bundles/{bundle}",
        "repository/libraries/ext/{library}",
        "repository/libraries/usr/{library}"
    ]
}

通過使用此配置配置兩個或多個 Platform 安裝,可以使它們共用 /shared-bundles 中的套件。 通過配置所有搜尋路徑以指向共用位置,可以輕鬆地將此步驟更進一步,因此您根本不需要管理每個 Platform 的佈建儲存庫。

下一步是什麼?

我們計劃通過提供一些工具或腳本來簡化從同一組二進位檔案執行 Platform 的多個實例。 這些工具或腳本將為您完成大部分工作,提供您可以調整以滿足您的特定需求的合理預設配置。

我們還打算通過允許將 Platform 配置為在嘗試滿足相依性時選擇性地搜尋遠端儲存庫,來結合 Platform 的隨需佈建和 SpringSource Enterprise Bundle Repository 的強大功能。 如果在遠端儲存庫中找到相依性,Platform 將自動處理其下載和安裝。 希望這將使開發人員的生活更加輕鬆,尤其是在應用程式開發的初始階段,因為會定期新增新的相依性。

當我們致力於上述增強功能和 Platform 時,我們很樂意聽到您的建議:請隨時評論此部落格文章、提出 JIRA,或在我們的 論壇上發表文章。

取得 Spring 電子報

訂閱 Spring 電子報以保持聯繫

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進度。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

了解更多

即將到來的活動

查看 Spring 社群中的所有即將到來的活動。

查看全部