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 的 profile 以啟動新子系統。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 子系統併為 profile 指定一個合適的名稱(我稱之為 slices)

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

OSGi Web 容器對 dm Server 的意義

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

在我上一篇博文之後,許多人一直在詢問遷移到 OSGi Web 容器對 dm Server 的影響。最常見的問題是

  • 添加了什麼?
  • 保持不變的是什麼?
  • 改變了什麼?
  • 我如何保持更新?

我將獨立回答這些問題。如果您有更多問題,請隨時發表評論。

添加了什麼?

與 Web 容器 RI 整合將使 dm Server 能夠訪問 OSGi Web 容器標準的所有特性。這包括處理 WAR 檔案、支援 webbundle URL 方案以及支援 Web 容器擴充套件的標準模型。

我正在探索為 RI 新增一些有價值的特性,包括使用 ConfigAdmin 進行動態配置、用於自省已部署 Web 包的全面 MBean 介面以及 EventAdmin 整合以監控生命週期事件。所有這些特性都將新增到 dm Server 以及 RI 中。

保持不變的是什麼?

您會很高興得知,您在 dm Server 中學到的大部分 Web 應用程式知識保持不變。

使用 dm Server 部署器

除了支援 webbundle URL 外,仍然可以使用 dm Server 部署器部署 WAR 檔案。部署器的所有路徑都支援,包括 pickup 目錄、deployer MBean 和 Admin Console。

使用 dm Server 部署器進行部署時,WAR 檔案依賴項將從配置的倉庫鏈中可用的 Bundle 中自動安裝。

WAR 部署模式

程式設計師指南中提到的所有 WAR 型別都保留了下來 - 實際上它們是 Web 容器標準的一部分。

系統包匯入

即使此特性未能進入標準,使用 dm Server 部署的 WAR 檔案也會自動匯入所有配置的系統包。如果使用 webbundle URL 進行部署,您可以使用 URL 引數觸發系統包匯入。我希望規範能包含這方面的一些標準行為

改變了什麼?

我們致力於在 dm Server 中保持大多數特性不變,但遷移到 Web 容器確實需要一些更改。同時,我們正在利用程式碼重構的機會,整合我們從使用者那裡看到的一些更受歡迎的特性請求。

Web 模組正在移除

最大的變化是移除了web 模組。我們的偏好是支援基於標準的方法,既然我們已經能夠與 OSGi 聯盟合作,建立基於標準的 OSGi Web 應用程式方法,我們將轉向它,而不是特定於 dm Server 的解決方案。

對於目前正在使用 Web 模組的各位,我非常想了解您最喜歡哪些特性,哪些失去會讓您感到遺憾。重要的 Web 模組特性完全可以在 Web 容器 Web Bundle 之上進行重構。

切換到 Tomcat 配置格式

在 1.0.x 版本中,dm Server 中嵌入的 Tomcat 例項使用 JSON 配置檔案格式進行配置。許多使用者要求我們切換回使用 Tomcat 的 XML 格式。Web 容器 RI 使用標準的 Tomcat 格式,當 dm Server 切換到 Web 容器時,也將切換配置檔案格式。

我仍在最終確定配置檔案的具體儲存位置。我希望能夠透過佔位符來引數化 Tomcat 配置檔案,這些佔位符可以從 ConfigAdmin 中填充

我如何保持更新?

瞭解最新進展的最簡單方法是跟蹤 Web 容器和 dm Server Web 的 SVN 倉庫。您可以透過以下 URL 訪問這些倉庫

我將定期在此釋出部落格文章,您也可以在 Twitter 上關注進度,使用 #osgi#dmserver 標籤。

OSGi Web 容器簡介

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

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

在過去的幾個月裡,我一直在與 Subbarao Meduri、Graham Charters、Hal Hildebrand 以及 OSGi 企業專家組的其他成員一起研究 RFC66 Web 容器規範。Web 容器規範定義瞭如何在 OSGi 服務平臺上以標準方式部署 WAR 檔案。

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

宣佈 dm Server 2.0 M1

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

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 月 1 日 | ...

我們收到很多 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 bundle。顯然,這些不是真實的 bundle。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 匯入了範圍為 [1.0, 1.0] 的 eclipselink,而 app2 匯入了範圍為 [2.0, 2.0]eclipselink。如果我將這些 bundle 安裝到 Equinox 中,然後嘗試啟動 app bundle,控制檯將顯示類似以下內容

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 bundle 都已解析。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 衝突。這意味著 app2 中對 spring.orm.hibernate 的匯入無法滿足,因為它的其他匯入與 *可能* 提供 spring.orm.hibernate 的 bundle(在本例中是 spring bundle)上的 uses 約束髮生衝突。

診斷此問題的第一步是找出 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 匯出。有了這些資訊,我們可以找出在 bundle 2uses 指令中列出的 spring.orm.hibernate 包包含哪些包

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 需要範圍為 [1.0, 2.0)eclipselink,而 app2 需要範圍為 [2.0, 2.0]eclipselink - 這兩個範圍互斥,這意味著 app2 *不能* 與 spring bundle 連線到相同版本的 eclipselink

uses 列表很長的情況下,您可以透過找出哪些列出的包有多個供應商來縮小可能的衝突範圍。必須存在多個供應商才能出現 uses 約束衝突。

版本不匹配並非依賴約束不匹配的唯一原因。約束可能由於屬性以及版本而無法匹配。

安裝順序問題

如果我們回到前面的例子,並將 spring bundle 的 manifest 修改為可以接受 2.0 版本的 eclipselink 包,並放寬 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"

安裝 bundle 並啟動 app bundle 表明這一改變產生了很大的不同

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 bundle 都可以啟動了。不幸的是,還有一個更微妙的問題等待著我們。取決於安裝順序,這組 bundle 仍然可能無法一起執行。為了說明這一點,讓我們將 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

應用程式 2 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 約束又出現了。按照上一節中確定的診斷步驟在這裡不會有幫助,因為沒有依賴約束不匹配 - 我們知道這一點,因為第一次這些 Bundle 都能正常解析。

這裡的問題是解析順序。Bundle 分成兩個不同的塊安裝和解析。第一個塊包括 springeclipselink_1app1,第二個塊包括 eclipselink_2app2。當第一個塊解析時(作為啟動 app1 Bundle 的結果),spring Bundle 將其匯入的 eclipselink 包連線到 eclipselink_1 Bundle。這可以透過控制檯進行確認

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。當所有 bundle 都作為一個塊安裝和解析時,OSGi 解析器會嘗試滿足 *所有* 約束,包括確保可以滿足 spring.orm.hibernate 上的 uses 約束。

要解決這個問題,我們不需要更改 Bundle。相反,我們可以將 Bundle 作為一塊重新安裝,或者我們可以觸發對 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 社群所有即將舉行的活動。

檢視全部