在 SpringSource dm Server 中部署 GWT 應用程式 - 第 2 部分

工程 | Ben Corrie | 2008 年 11 月 24 日 | ...

簡介

這是關於在 SpringSource dm Server™ 中建立和部署 GWT 應用程式的分步驟方法的系列部落格文章的第二篇。第一篇部落格介紹了從範例 GWT 應用程式建立簡單 WAR 檔案的過程。接下來的這篇部落格將介紹如何將我們在第 1 部分中建立的 WAR 檔案轉換為 「共享程式庫」 WAR。這表示我們將應用程式的 GWT 依賴項外部化到 OSGi 綁定中,以便它可以被任意數量的 GWT 應用程式共享。您可以將其視為使用 GWT 遠端處理功能擴展我們的 dm Server。

第 1 部分 中所述,我在這第二篇部落格文章中沒有使用 Spring Framework,而是專注於 SpringSource dm Server™SpringSource Tool Suite 來部署「純」GWT。

另請參閱第 1 部分,以了解 GWT StockWatcher 範例和我使用的軟體的背景資訊。

快速回顧

第 1 部分 中,我們從頭開始將 GWT StockWatcher 範例應用程式建置為 Eclipse 專案,然後將程式碼產生到動態 Web 專案中,然後將其部署到 dm Server 中。最後,我們將動態 Web 專案匯出到 WAR 檔案中,並在 STS 之外部署它。

此處描述的分步方法將基於我們在 第 1 部分 中所做的工作,而不是重新開始。 我們現在要變更的唯一一件事是移除對以下項目的顯式依賴性:gwt-servlet.jar程式庫。

步驟 1:將我們的 GWT 依賴項轉換為 OSGi 綁定

首先,再多說一些背景知識。「共享程式庫」方法的整個概念是在 dm Server 中使用 OSGi 綁定之間的顯式匯入和匯出建立依賴項對應。對於像我們的 StockWatcher 範例這樣的小型 WAR,這主要只是一個有趣的學術練習。但是,鑑於許多商業 Web 專案都以大型 WAR 檔案的形式發布,這些檔案與數十甚至數百個依賴的 jar 檔案打包在一起,因此將這些依賴項分解為可共享的資源不僅從佔用空間的角度來看是有意義的,而且還使應用程式的打包、版本控制和維護變得更加輕鬆。

好消息是,建立這些依賴項的大部分工作已經為您完成了。SpringSource Enterprise Bundle Repository 包含大多數常見程式庫的「綁定」版本。但是,在撰寫本文時,我們的 GWT 依賴項是一個您必須轉換為綁定的程式庫範例...

診斷 OSGi uses 衝突

工程 | Rob Harrop | 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 綁定匯入了 eclipselink 套件,範圍為 [1.0, 2.0)。 顯然,只有 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 匯入了 eclipselink,範圍為 [1.0, 1.0],而 app2 匯入了 eclipselink,範圍為 [2.0, 2.0]。 如果我將這些綁定安裝到 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 的綁定上的 uses 限制衝突 - 在這種情況下為 spring 綁定。

診斷此問題的第一步是找出 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 匯出。 透過此知識,我們可以找出 spring.orm.hibernate 套件在綁定 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 綁定需要在範圍 [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_1 套件,以滿足它對 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 套件匯入的。當第二個區塊安裝時,app2 套件無法解析,因為它需要 eclipselink 版本 2.0.0,但 spring 已經連接到 eclipselink 版本 1.0.0。當所有套件作為一個區塊安裝和解析時,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 旗下首個 Grails 版本

工程 | Graeme Rocher | 2008 年 11 月 14 日 | ...

我很高興宣布 SpringSource 收購 G2One 以來的首個 Grails 版本。Grails 1.0.4 包含許多改進,以及 Grails 所基於的關鍵函式庫的升級,可以從 Grails 下載頁面下載。更具體地說,Grails 1.0.4 附帶了 最新的 Spring 2.5.6 版本,該版本是在大約一周前發布的。

除了這些改進之外,此版本還有一些有趣的新功能。第一個是新增了一個功能,可以更好地支援在 GORM 中映射 Hibernate 使用者類型定義。您現在可以映射自定義使用者類型……

更多對抗複雜性的武器:SpringSource 收購 Groovy/Grails 領導者

工程 | Rod Johnson | 2008 年 11 月 11 日 | ...

我很高興地宣布 SpringSource 收購了 G2OneGrailsGroovy 背後的公司。

為什麼?

我對這筆交易感到興奮,原因有很多。

Grails 非常適合 Spring 和 SpringSource 技術。Grails 是建立在 Spring 之上的。它提供了另一種採用 Spring 的途徑,Spring 是企業 Java 的事實標準組件模型。Spring(和 Java)的所有功能都位於每個基於 Grails 的應用程式的表面之下 - 這是 Grails 可以擴展到企業使用的關鍵原因,也是對 Spring 的功能和靈活性的驗證。

與 Spring 一樣,Grails 是一種簡化開發人員生活並提高他們生產力的技術。正如我們的新標語對抗 Java 複雜性的武器所反映的那樣,簡化一直是我們作為一家公司和作為技術人員所做工作的核心……

Spring for .NET 1.2.0 已發布

發布 | Mark Pollack | 2008 年 11 月 10 日 | ...

我們很高興地宣布 Spring for .NET 1.2.0 現在可用。

下載 | 支援 | 文件| 社群

此版本包含以下新的主要功能

  • WCF 整合 - 使用依賴注入配置 WCF 服務。將 AOP 建議應用於 WCF 服務。
  • MSMQ 整合 - MSMQ 輔助類別可提高您開發訊息應用程式的生產力。提供與 Spring 的事務管理功能的整合。
  • Apache ActiveMQ 整合 - 輔助類別可提高您使用 ActiveMQ/NMS 開發訊息應用程式的生產力
  • Quartz 整合 - 使用依賴注入配置 Quartz 作業、排程器、觸發器。用於實現 Quartz 作業的便利類別。
  • AOP- 基於繼承的新 AOP 代理產生
  • NHibernate 2.0.1 支援。
此版本包含自 1.1.2 版本以來約 100 個錯誤修正和增強功能。

請參閱變更日誌以獲取更多詳細資訊。

祝您使用愉快!

Spring JavaConfig 1.0.0.M4 已發布

發布 | Chris Beams | 2008 年 11 月 07 日 | ...

親愛的 Spring 社群,
我們很高興地宣布 Spring JavaConfig 1.0.0.M4 現在可用。
下載 | 參考文件 | API 文件

主要亮點

  • @AnnotationDrivenTx - 支援宣告式事務管理
  • @AnnotationDrivenConfig - 支援 @Autowired、@Resource 等。
  • @ComponentScan - 直接從 JavaConfig 掃描 @Component 類別
  • @AspectJAutoProxy - 對 @Aspect bean 的一流支援
  • @MBeanExport - 對匯出 JMX MBean 的一流支援
  • 完整的 PetClinic 範例現在隨發行版提供,展示了 JavaConfig 的使用
  • 透過 @ExternalValue 和 @PropertiesValueSource 改進了對外部化值的支援
  • @ImportXml - 從 JavaConfig 啟動 Spring XML bean 定義
  • 改進的錯誤處理
  • ... 以及數十個其他已解決的問題


請對此里程碑進行測試,並透過 Spring JavaConfig 論壇問題追蹤器提供您的意見反應。如需更多資訊,請造訪 Spring JavaConfig 首頁

Chris Beams
Spring JavaConfig 負責人

在 SpringSource dm Server 中部署 GWT 應用程式 - 第 1 部分

工程 | Ben Corrie | 2008 年 11 月 07 日 | ...

簡介

這將是一個包含 3 篇部落格文章的系列,描述了在 SpringSource dm Server™ 中建立和部署 GWT 應用程式的分步方法。這些部落格文章的重點如下
  1. 在 dm Server 中以 WAR 檔案的形式建立和部署 GWT StockWatcher 範例應用程式,使用 SpringSource Tool Suite 從頭開始建立它。
  2. 使用「共用函式庫」方法部署:如何從 WAR 中移除 GWT 依賴項,並將它們作為 OSGi 套件部署在 dm Server 中。
  3. 使用「共用服務」方法部署:我們將單個 WAR 檔案轉換為 OSGi 服務,這些服務可以由其他應用程式共用並熱插拔。
值得注意的是,我在前兩篇部落格文章中沒有在任何地方使用 Spring Framework。Spring 和 GWT 之間的整合本身就是一個主題,我想盡可能保持每篇部落格文章的重點。在第三篇部落格文章中,我將展示如何使用 Spring 發布和使用 OSGi 服務,以及如何將其與 GWT 整合。

背景

該部落格文章將採取實際的分步方法來建立 此處描述的 GWT StockWatcher 範例。Google 教程將引導您完成使用 RPC 從頭開始建立 GWT 範例所需的步驟。當我們進行時,我將參考教程中的頁面,並討論各種方法的優點/缺點。

該部落格文章假設您已安裝 SpringSource Tool Suite 1.1.1(我使用的是 Eclipse 3.4 版本)、dm Server 1.0.0GWT 1.5。它還假設您對 Java 程式設計有很好的理解,並且對 Javascript 和 Ajax 有基本的理解。

為了演示中使用的路徑的目的,我在以下位置建立了一個新的 Eclipse 工作區/Users/bcorrie/gwt/workspace。我已包含您可以下載的 zip 壓縮專案,其中包含GWT_ROOT_INSTALL我定義的變數。要使用我的專案,當您匯入它們時,請導航到「Preferences」->「Java」->「Build Path」->「Classpath Variables」並定義您自己的GWT_ROOT_INSTALL……

Spring 2.5.6 已發布

發布 | Adam Fitzgerald | 2008 年 11 月 04 日 | ...

我們很高興地宣布 Spring 2.5.6 已經發布。
下載 | 支援服務 | 文件 | 變更日誌
此版本主要修正了一些錯誤,並新增了一些新功能


請參閱變更日誌以取得更多詳細資訊。

祝您使用愉快!

取得 Spring 電子報

隨時掌握 Spring 電子報的最新資訊

訂閱

領先一步

VMware 提供訓練和認證,可加速您的進展。

了解更多

取得支援

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

了解更多

即將舉行的活動

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

查看全部