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 檔案,並編輯配置檔案配置部分以列出 slices 子系統併為配置檔案指定一個合適的名稱(我將其命名為 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 之外,WAR 檔案仍然可以使用 dm Server 部署器進行部署。部署器的所有路徑都受支援,包括 pickup 目錄、部署器 MBean 和管理控制檯。

使用 dm Server 部署器部署時,WAR 檔案依賴項將從配置的儲存庫鏈中可用的捆綁包自動安裝。

WAR 部署模式

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

系統包匯入

使用 dm Server 部署的 WAR 將自動匯入所有配置的系統包,即使此功能未納入標準。如果使用 webbundle URL 部署,您可以使用 URL 引數觸發系統包匯入。我希望該規範能在此領域包含一些標準行為

什麼正在改變?

我們旨在在 dm Server 中保持大部分功能不變,但轉向 Web 容器確實需要進行一些更改。同時,我們正在利用程式碼重構來整合我們從使用者那裡看到的一些更受歡迎的功能請求。

Web 模組正在被移除

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

對於今天使用 Web 模組的您,我非常想聽聽您最喜歡哪些功能以及會因為失去它們而感到難過。重要的 Web 模組功能完全可以基於 Web 容器 Web 捆綁包進行重構。

切換到 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 個月了,我們很高興能夠朝著標準模型努力。作為終端使用者,您將能夠將 WAR 檔案部署到 OSGi 上而無需……

宣佈 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 例項中的工件。然後可以將這些共享倉庫新增到 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 捆綁包組成的應用程式構建解決方案的未來越來越感興趣。由於我們與 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-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 捆綁包和兩個 eclipselink 捆綁包。顯然,這些不是真正的捆綁包。spring 捆綁包匯入了範圍為 [1.0, 2.0)eclipselink 包。顯然,只有 eclipselink_1 捆綁包可以滿足此約束。現在,考慮來自兩個不同應用程式的這些清單

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] 的 eclipselinkapp2 匯入了範圍 [2.0, 2.0]eclipselink。如果我將這些捆綁包安裝到 Equinox 中,然後嘗試啟動應用程式捆綁包,控制檯會顯示類似以下內容

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 捆綁包都已解析。app1 捆綁包已啟動,但 app2 捆綁包無法啟動。要找出原因,我們可以使用 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 捆綁包無法解析,因為它匯入的 spring.orm.hibernate 存在包 uses 衝突。這意味著 app2 中對 spring.orm.hibernate 的匯入無法滿足,因為它的其他匯入之一與可能提供 spring.orm.hibernate 的捆綁包(在本例中是 spring 捆綁包)上的 uses 約束髮生衝突。

診斷此問題的第一步是找出 spring.orm.hibernate 捆綁包的可能提供者。從我們的用例中我們知道唯一可能的提供者是 spring 捆綁包,但如果您不知道提供者,可以使用 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 包由捆綁包 2 匯出。有了這些知識,我們可以找出捆綁包 2spring.orm.hibernate 包的 uses 指令中列出的包

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 捆綁包需要範圍為 [1.0, 2.0)eclipselink,而 app2 需要範圍為 [2.0, 2.0]eclipselink - 這兩個範圍是互斥的,這意味著 app2 無法spring 捆綁包連線到相同版本的 eclipselink

uses 列表很長的情況下,您可以透過找出列出的哪些包具有多個供應商來縮小可能的違規範圍。必須始終有多個供應商才能看到 uses 約束違規。

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

安裝順序問題

如果我們回到之前的示例,並更改 spring 捆綁包的清單,使其能夠接受版本 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"

安裝捆綁包並啟動應用程式捆綁包表明這種改變產生了很大的不同

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

現在兩個應用程式捆綁包都可以啟動。不幸的是,還有一個更微妙的問題等待著我們。根據安裝順序,這組捆綁包可能仍然無法一起執行。為了說明這一點,讓我們將 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 捆綁包無法啟動。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 約束又回來了。執行上一節中確定的診斷步驟將無濟於事,因為沒有依賴約束不匹配——我們知道這一點,因為第一次這些捆綁包解析得很好。

這裡的問題是解析順序。捆綁包分兩個不同的塊安裝和解析。第一個塊包括 springeclipselink_1app1,第二個塊包括 eclipselink_2app2。當第一個塊被解析(由於啟動 app1 捆綁包)時,spring 捆綁包會將其對 eclipselink 包的匯入連線到 eclipselink_1 捆綁包。這可以透過控制檯確認

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 捆綁包匯入的。當第二個塊安裝時,app2 捆綁包無法解析,因為它需要版本 2.0.0eclipselink,但 spring 已經連線到版本 1.0.0eclipselink。當所有捆綁包作為一個塊安裝和解析時,OSGi 解析器將嘗試滿足所有約束,包括確保 spring.orm.hibernate 上的 uses 約束能夠滿足。

要解決此問題,我們無需更改我們的捆綁包。相反,我們可以將捆綁包重新安裝到一個塊中,或者我們可以觸發對 spring 捆綁包的重新整理——實際上是要求 OSGi 重新執行解析過程。現在 eclipselink_2 捆綁包已安裝,我們可以預期會有不同的結果

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 捆綁包解析。springeclipselink 包的連線已更改,由 eclipselink_2 捆綁包中版本 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 社群所有即將舉行的活動。

檢視所有