Rob Harrop

校友
由…撰寫的部落格文章Rob Harrop

使用 SpringSource Slices 的模組化 Web 應用程式

工程 | 2009 年 6 月 22 日 | ...

已更新:新增了 Git 的子模組說明。

我過去曾談過提供對真正模組化應用程式的支援,我很高興地宣布,您現在可以存取 SpringSource Slices 的早期原型程式碼。

建置與安裝

您可以從我們的 Git 儲存庫存取原始碼

git clone git://git.springsource.org/slices/slices.git
git submodule init
git submodule update

若要建置 Slices 的封裝版本,只需從 build-slices 目錄執行 ant clean jar package 即可

cd slices/build-slices
ant clean jar package

這將在 target/artifacts 中產生一個 zip 檔案,其中包含 Slices 子系統,然後可以將其安裝在 dm Server 2.0 之上

安裝 Slices 只是將新的子系統新增至 dm Server,然後更新 dmServer 的設定檔以啟動新的子系統。Slices 應該適用於任何最新的 dm Server 2.0 快照版本。在這裡,我使用的是 2.0.0.CI-R326-B274,我已經下載並在我的桌面上解壓縮

 unzip target/artifacts/springsource-slices-BUILD-20090622083953.zip -d ~/Desktop/springsource-dm-server-2.0.0.CI-R326-B274

接下來,必須更新 dm Server 的 kernel.properties 設定以包含新的 slices 子系統。開啟 dm Server 安裝的 config/kernel.properties 檔案,並編輯 Profile Configuration 區段以列出 slices 子系統,並為設定檔提供一個適當的名稱(我將其稱為 slices)

#######################
# Profile Configuration
#######################
profile.name=slices…

OSGi Web Container 對於 dm Server 的意義

工程 | 2009 年 6 月 01 日 | ...

繼我的前一篇文章之後,很多人一直在詢問轉移到 OSGi Web Container 將對 dm Server 產生什麼影響。 最常被問到的問題是

  • 新增了什麼?
  • 哪些保持不變?
  • 正在改變什麼?
  • 我如何保持最新狀態?

我將分別回答這些問題。如果您有任何其他問題,請隨時發表評論。

新增了什麼?

與 Web Container RI 整合將使 dm Server 能夠存取 OSGi Web Container 標準的所有功能。這包括處理 WAR 的標準模型、支援 webbundle URL 方案,以及支援 Web Container 擴充器。

我正在探索 RI 的一些不錯的增值功能,包括使用 ConfigAdmin 進行動態設定、用於檢視已部署 Web Bundle 的全面 MBean 介面,以及用於監視生命週期事件的 EventAdmin 整合。所有這些功能都將添加到 dm Server 以及 RI。

哪些保持不變?

您會很高興地知道,您在 dm Server 中學到的關於 Web 應用程式的大部分內容都保持不變。

使用 dm Server 部署程式

除了支援 webbundle URL 之外,仍然可以使用 dm Server 部署程式部署 WAR 檔案。支援所有進入部署程式的路徑,包括提取目錄、部署程式 MBean 和 Admin Console。

使用 dm Server 部署程式進行部署時,WAR 檔案相依性將自動從設定的儲存庫鏈中的可用 Bundle 安裝。

WAR 部署模式

程式設計人員指南中提到的所有 WAR 類型都保持不變 - 事實上,它們是 Web Container 標準的一部分。

系統套件匯入

即使此功能沒有進入標準,使用 dm Server 部署的 WAR 檔案也會自動匯入所有設定的系統套件。如果使用 webbundle URL 進行部署,您可以使用 URL 參數觸發系統套件匯入。我希望規範將包含該領域的一些標準行為

正在改變什麼?

我們的目標是讓 dm Server 中的大多數功能保持不變,但是遷移到 Web Container 確實需要進行一些更改。同時,我們正在利用程式碼重構來整合我們從使用者那裡看到的一些更受歡迎的功能要求。

Web 模組正在被移除

最大的變化是移除 web 模組。我們的首選是支援基於標準的方法,現在我們已經能夠與 OSGi Alliance 合作創建基於標準的 OSGi Web 應用程式方法,我們正在轉向它,而不是使用 dm Server 特定的解決方案。

對於那些今天正在使用 Web 模組的人,我真的很有興趣聽到您最喜歡哪些功能,並且不希望失去。沒有理由不能在 Web Container Web Bundle 之上重新設計重要的 Web 模組功能。

切換到 Tomcat 設定格式

在 1.0.x 系列中,嵌入在 dm Server 中的 Tomcat 實例是使用 JSON 設定檔格式設定的。我們的許多使用者要求我們切換回使用 Tomcat 的 XML 格式。Web Container RI 使用標準 Tomcat 格式,當 dm Server 切換到 Web Container 時,它也會切換設定檔格式。

我仍在確定確切的細節,即設定檔將儲存在哪裡。我希望能夠使用可以從 ConfigAdmin 填充的佔位符來參數化 Tomcat 設定檔

我如何保持最新狀態?

保持了解進度的最簡單方法是追蹤 Web Container 和 dm Server Web 的 SVN 儲存庫。您可以透過以下 URL 存取這些儲存庫

我會在這裡定期發布部落格,您可以透過 #osgi#dmserver 在 Twitter 上關注進度。

OSGi Web Container 簡介

工程 | 2009 年 5 月 27 日 | ...

已更新:新增了 Git 的版本控制說明。

在過去幾個月中,我一直與 Subbarao Meduri、Graham Charters、Hal Hildebrand 和 OSGi Enterprise Expert Group 的其他人合作制定 RFC66 Web Container 規範。Web Container 規範定義了如何以標準方式在 OSGi 服務平台上部署 WAR 檔案。

這對我們來說非常有趣,因為 dm Server 已經支援 WAR 檔案將近 18 個月了,我們很高興能夠朝著標準模型努力。作為最終使用者,您將能夠在 OSGi 上部署 WAR 檔案,而無需…

宣布 dm Server 2.0 M1

工程 | 2009 年 4 月 02 日 | ...

dm Server 2.0 的開發工作已經全面展開了一段時間,我很高興地宣布第一個里程碑版本現已可供下載。您可以從我們的首頁下載。您可以在我的前一篇文章中找到有關此版本和即將發布版本中的功能的更多資訊。

在本部落格文章中,我將概述

  • 2.0 M1 中的新增功能
  • 直接從 SVN 建置 dm Server

我們正在使用 Scrum

對於 2.0 版本的開發,dm Server 團隊採用了 Scrum。您可以在我們的 JIRA 中看到我們當前的 sprint 和發布待辦事項。與以往一樣,dm Server 的開發受到使用者需求的驅動。如果您在…

SpringSource dm Server 路線圖

工程 | 2009 年 4 月 01 日 | ...

我們從 dm Server 使用者那裡收到很多關於接下來幾個版本中預期的問題。在本部落格文章中,我將概述我們路線圖上的主要功能。我們遵循 Scrum 實務,因此您可以期望看到我們 sprint 的合理頻繁的里程碑版本作為輸出,並且我們在處理新需求和優先順序變更方面具有彈性。

共用儲存庫

共用儲存庫允許您擁有一個集中位置來管理可用於安裝在 dm Server 實例中的 Artifact。然後,可以將這些共用儲存庫添加到 dm Server 設定中…

宣布 dm Server 入門指南

工程 | 2009 年 3 月 30 日 | ...

在過去幾個月中,社群對 dm Server 表現出了極大的興趣。論壇非常活躍,並且我們在會議上進行演示時總是有激烈的討論。我們注意到,當使用者開始為 dm Server 開發他們的第一個應用程式時,會出現很多相同的問題,因此我們編寫了一份入門指南,以幫助您更快地上手。

透過閱讀入門指南並研究隨附的範例,您將學習以下最佳實務

  • 安裝 dm Server
  • 使用 dm Server Eclipse 工具設定有效的開發環境
  • 建立用於呈現邏輯的 Web 模組
  • 使用單獨的中介層和資料存取模組來建構您的應用程式
  • 建立和管理共用服務,例如資料來源
  • 建立單元和整合測試
  • 使用 Maven 建置 dm Server 應用程式

該指南提供 HTMLPDF 格式,並且可以在 此處找到範例應用程式的完整程式碼…

我們用於建置 OSGi 應用程式的計劃

工程 | 2009 年 3 月 18 日 | ...

在最近幾天和幾週內,我們看到人們對由 OSGi Bundle 組成的應用程式的建置解決方案的未來越來越感興趣。由於我們大量參與 OSGi,因此這對我們來說意義重大,並且我們花了很長時間來研究客戶需求以及這些需求的解決方案。在本部落格文章中,我將概述我們已識別的需求,並介紹我們看到的這些需求的解決方案。

我非常有興趣聽取任何有額外需求、認為我們擁有的需求是虛假或有…

SpringOne Americas 2008 的投影片和演示

工程 | 2008 年 12 月 11 日 | ...

正如向我的課程的與會者承諾的那樣,這是我的 dm Server 和並行課程的內容。

dm Server 簡介

此簡報的投影片和演示程式碼已附加到我的前一篇文章:SpringSource dm Server 入門

當我在會議上時,我遇到了來自 Spring by Example 的 David Winterfeldt,他向我推薦了他的精彩 dm Server 教學課程

進階並行

進階並行處理簡報的投影片可以在這裡找到,而示範程式碼則在這裡。去年並行處理簡報的投影片可以在這裡找到。

診斷 OSGi uses 衝突

工程 | 2008年11月22日 | ...

在他的近期部落格文章中,Glyn 介紹了 OSGi "uses" 指令。在這篇部落格中,我想更深入地探討 uses 約束違規的原因,並提供一些診斷應用程式中 uses 問題的技巧。

對於大多數範例,我將使用原始的 Equinox,而不是 dm Server。原因在於 uses 約束並非 dm Server 所獨有,而是與所有 OSGi 使用者相關。在這篇部落格的最後,我將示範 dm Server 內建的一些智慧約束失敗診斷功能。

相依約束不符

uses 違規最常見的原因是一個或多個相依約束之間的不匹配。舉例來說,請考慮以下三個 manifest 檔案

Manifest-Version: 1.0
Bundle-Name: Spring Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: spring
Bundle-Version: 2.5.5
Export-Package: spring.orm.hibernate;version="2.5.5";uses:="eclipselink"
Import-Package: eclipselink;version="[1.0, 2.0)"

Manifest-Version: 1.0
Bundle-Name: EclipseLink 1 Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: eclipselink
Bundle-Version: 1
Export-Package: eclipselink;version="1.0.0"

Manifest-Version: 1.0
Bundle-Name: EclipseLink 2 Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: eclipselink
Bundle-Version: 2
Export-Package: eclipselink;version="2.0.0"

在這裡您可以看到一個 spring bundle 和兩個 eclipselink bundles。顯然,這些不是真正的 bundles。spring bundle 匯入了 eclipselink 套件,範圍為 [1.0, 2.0)。顯然,只有 eclipselink_1 bundle 可以滿足這個約束。現在,請考慮來自兩個不同應用程式的這些 manifest 檔案

Manifest-Version: 1.0
Bundle-Name: App1 Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: app1
Bundle-Version: 1.0.0
Import-Package: spring.orm.hibernate,eclipselink;version="[1.0, 1.0]"

Manifest-Version: 1.0
Bundle-Name: App2 Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: app2
Bundle-Version: 1.0.0
Import-Package: spring.orm.hibernate,eclipselink;version="[2.0, 2.0]"

在這裡我們可以看到 app1 匯入了 eclipselink,範圍為 [1.0, 1.0],而 app2 匯入了 eclipselink,範圍為 [2.0, 2.0]。如果我將這些 bundles 安裝到 Equinox 中,然後嘗試啟動 app bundles,則主控台會顯示類似以下內容

id      State       Bundle
0       ACTIVE      org.eclipse.osgi_3.4.0.v20080605-1900
2       RESOLVED    spring_2.5.5
3       RESOLVED    eclipselink_1.0.0
4       RESOLVED    eclipselink_2.0.0
5       ACTIVE      app1_1.0.0
6       INSTALLED   app2_1.0.0

在這裡我們可以看到 springeclipselink bundles 都已解析。app1 bundle 已經啟動,但是 app2 bundle 無法啟動。要找出原因,我們可以使用 diag 命令

osgi> diag app2
file:/Users/robharrop/dev/resdiag/uses/app2/bin [6]
  Package uses conflict: Import-Package: spring.orm.hibernate; version="0.0.0"

在這裡我們可以看到 app2 bundle 無法解析,因為它的 spring.orm.hibernate 匯入存在套件 uses 衝突。這表示 app2spring.orm.hibernate 的匯入無法滿足,因為它的其他匯入之一與 _可以_ 提供 spring.orm.hibernate 的 bundle 上的 uses 約束衝突 - 在這種情況下是 spring bundle。

診斷的第一步是找出 spring.orm.hibernate bundle 的可能提供者。從我們的用例中我們知道唯一可能的提供者是 spring bundle,但是如果您不知道提供者,您可以使用 packages 命令找到它們

osgi> packages spring.orm.hibernate
spring.orm.hibernate; version="2.5.5"<file:/Users/robharrop/dev/resdiag/uses/spring/bin [2]>
  file:/Users/robharrop/dev/resdiag/uses/app1/bin [5] imports

這向我們展示了 spring.orm.hibernate 套件由 bundle 2 匯出。有了這些知識,我們可以找出 spring.orm.hibernate 套件在 bundle 2uses 指令中列出了哪些套件

osgi> headers 2
Bundle headers:
 Bundle-ManifestVersion = 2
 Bundle-Name = Spring Bundle
 Bundle-SymbolicName = spring
 Bundle-Version = 2.5.5
 Export-Package = spring.orm.hibernate;version="2.5.5";uses:="eclipselink"
 Import-Package = eclipselink;version="[1.0, 2.0)"
 Manifest-Version = 1.0

在這裡我們可以看到 uses 中唯一的套件是 eclipselink 套件,所以它一定是罪魁禍首。事實上,我們可以知道 Spring bundle 需要 eclipselink,範圍為 [1.0, 2.0),而 app2 需要 eclipselink,範圍為 [2.0, 2.0] - 這兩個範圍是不相交的,這意味著 app2 _無法_ 連接到與 spring bundle 相同的 eclipselink 版本。

如果 uses 列表很長,您可以透過找出哪個列出的套件有多個提供者來縮小可能的違規範圍。必須始終有多個提供者,您才能看到 uses 約束違規。

版本不匹配不是相依約束不匹配的唯一原因。約束可能由於屬性和版本而不匹配。

安裝順序問題

如果我們重新審視先前的範例,並變更 spring bundle 的 manifest 檔案,使其可以接受 eclipselink 套件的 2.0 版,並放寬 app1 上的範圍,使其可以接受 1.0 以上的任何版本,我們應該可以解決這個問題

Manifest-Version: 1.0
Bundle-Name: Spring Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: spring
Bundle-Version: 2.5.5
Export-Package: spring.orm.hibernate;version="2.5.5";uses:="eclipselink"
Import-Package: eclipselink;version="[1.0, 2.0]"

Manifest-Version: 1.0
Bundle-Name: App1 Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: app1
Bundle-Version: 1.0.0
Import-Package: spring.orm.hibernate,eclipselink;version="1.0"

安裝 bundles 並啟動 app bundles 表明此變更產生了很大的不同

id      State       Bundle
0       ACTIVE      org.eclipse.osgi_3.4.0.v20080605-1900
1       RESOLVED    spring_2.5.5
2       RESOLVED    eclipselink_1.0.0
3       RESOLVED    eclipselink_2.0.0
4       ACTIVE      app1_1.0.0
5       ACTIVE      app2_1.0.0

現在兩個 app bundles 都可以啟動。不幸的是,還有一個更微妙的問題等著我們。根據安裝順序,這組 bundles 仍然可能無法一起執行。為了說明這一點,讓我們將 springeclipselink_1app1 作為一個交易安裝,並啟動 app1

id      State       Bundle
0       ACTIVE      org.eclipse.osgi_3.4.0.v20080605-1900
1       RESOLVED    spring_2.5.5
2       RESOLVED    eclipselink_1.0.0
3       ACTIVE      app1_1.0.0

現在,讓我們安裝 eclipselink_2app2

id      State       Bundle
0       ACTIVE      org.eclipse.osgi_3.4.0.v20080605-1900
1       RESOLVED    spring_2.5.5
2       RESOLVED    eclipselink_1.0.0
3       ACTIVE      app1_1.0.0
4       RESOLVED    eclipselink_2.0.0
5       INSTALLED   app2_1.0.0

app2 bundle 將無法啟動。diag 的輸出告訴我們原因

osgi> diag app2
file:/Users/robharrop/dev/resdiag/uses/app2/bin [5]
  Package uses conflict: Import-Package: spring.orm.hibernate; version="0.0.0"

uses 約束又回來了。執行先前章節中識別的診斷步驟沒有幫助,因為沒有相依約束不匹配 - 我們知道這一點,因為第一次這些 bundles 解析得很好。

這裡的問題是解析順序。這些 bundles 分成兩個不同的區塊安裝和解析。第一個區塊包括 springeclipselink_1app1,第二個區塊包括 eclipselink_2app2。當第一個區塊解析時(由於啟動 app1 bundle 的結果),spring bundle 會連接到 eclipselink_1 bundle,以匯入 eclipselink 套件。這可以使用主控台確認

osgi> bundle app1
file:/Users/robharrop/dev/resdiag/uses/app1/bin [3]
  Id=3, Status=ACTIVE      Data Root=/opt/springsource-dm-server-1.0.0.RELEASE/lib/configuration/org.eclipse.osgi/bundles/3/data
  No registered services.
  No services in use.
  No exported packages
  Imported packages
    spring.orm.hibernate; version="2.5.5"<file:/Users/robharrop/dev/resdiag/uses/spring/bin [1]>
    eclipselink; version="1.0.0"<file:/Users/robharrop/dev/resdiag/uses/eclipselink1/bin [2]>
  No fragment bundles
  Named class space
    app1; bundle-version="1.0.0"[provided]
  No required bundles

請注意,匯入的套件區段顯示 eclipselink 版本 1.0.0 是從 eclipselink_1 bundle 匯入的。當安裝第二個區塊時,app2 bundle 無法解析,因為它需要版本 2.0.0eclipselink,但 spring 已經連接到版本 1.0.0eclipselink。當所有 bundles 作為一個區塊安裝和解析時,OSGi 解析器將嘗試滿足 _所有_ 約束,包括確保可以滿足 spring.orm.hibernate 上的 uses 約束。

要解決這個問題,我們不需要變更我們的 bundles。相反地,我們可以重新安裝一個區塊中的 bundles,或者我們可以觸發針對 spring bundle 的重新整理 - 有效地要求 OSGi 重新執行解析程序。現在 eclipselink_2 bundle 已經安裝,我們可以預期這會有不同的結果

osgi> refresh spring

osgi> ss

Framework is launched.

id      State       Bundle
0       ACTIVE      org.eclipse.osgi_3.4.0.v20080605-1900
1       RESOLVED    spring_2.5.5
2       RESOLVED    eclipselink_1.0.0
3       ACTIVE      app1_1.0.0
4       RESOLVED    eclipselink_2.0.0
5       ACTIVE      app2_1.0.0

osgi> bundle spring
file:/Users/robharrop/dev/resdiag/uses/spring/bin [1]
  Id=1, Status=RESOLVED    Data Root=/opt/springsource-dm-server-1.0.0.RELEASE/lib/configuration/org.eclipse.osgi/bundles/1/data
  No registered services.
  No services in use.
  Exported packages
    spring.orm.hibernate; version="2.5.5"[exported]
  Imported packages
    eclipselink; version="2.0.0"<file:/Users/robharrop/dev/resdiag/uses/eclipselink2/bin [4]>
  No fragment bundles
  Named class space
    spring; bundle-version="2.5.5"[provided]
  No required bundles

請注意,重新整理 spring 會導致 app2 bundle 解析。springeclipselink 套件的連接已變更為由 eclipselink_2 bundle 中版本 2.0.0 的匯出滿足。

dm Server 中的 Uses 約束

當您在 dm Server 中遇到 uses 約束違規時,我們已經嘗試為您執行一些分析步驟,特別是識別可能不匹配的相依約束

Could not satisfy constraints for bundle 'app2' at version '1.0.0'.
 Cannot resolve: app2
  Resolver report:
    Bundle: app2_1.0.0 - Uses Conflict: Import-Package: spring.orm.hibernate; version="0.0.0"
      Possible Supplier: spring_2.5.5 - Export-Package: spring.orm.hibernate; version="2.5.5"
        Possible Conflicts: eclipselink

Uses 約束在企業程式庫中很常見,手動診斷失敗可能是一場真正的惡夢。特別是,當您有一個匯出的套件,並且在其 uses 子句中列出了 10 個或更多套件時,確定可能的衝突可能非常耗時。因此,自動化診斷是必須的,我希望不斷改進 dm Server 中的診斷程式碼,以便處理常見錯誤變得微不足道。

在下一個版本中,我們計劃將診斷工具直接建置到我們的 dm Server Eclipse 工具中,以便大多數這些問題將由 dm Server 自動診斷。

SpringSource dm Server 入門

工程 | 2008年10月22日 | ...

更新日期:2008年10月28日:新增最新的範例連結和第三個範例的連結

昨晚我在費城 Spring 使用者群組上展示了“SpringSource dm Server 簡介”。在這次簡報中,我建立了一個名為 GreenPages 的小型應用程式,展示了 dm Server 的所有主要方面。我向與會者承諾,我會在這裡張貼該應用程式和投影片。

自 dm Server GA 版本發布以來的過去幾週,許多人一直在詢問開始使用 dm Server 的最佳方法,因此我正在使用此條目將所有相關資訊收集在一起…

搶先一步

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

了解更多

取得支援

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

了解更多

即將舉行的活動

查看 Spring 社群中所有即將舉行的活動。

查看全部