第一個 Spring Framework 3.0 里程碑版本發佈

工程 | Juergen Hoeller | 2008 年 12 月 05 日 | ...

我很高興宣布 Spring Framework 3.0 M1 終於可以下載了!

此版本包含多項重大變更,包括 3.0 的主要主題的開始,例如 **EL 和 REST 支援**

  • 使用**基於模組的來源**修訂專案佈局和建置系統
  • 針對 **Java 5 程式碼樣式**(泛型、可變參數)更新了整個程式碼庫
  • 更新至 **JUnit 4.5** 和 JRuby 1.1
  • 引入 **Spring EL 解析器** (org.springframework.expression package)
  • 引入對 **bean 定義中的 #{...} 運算式**的支援
  • 引入 **expression-enabled @Value 註解**以用於嵌入式運算式
  • 在 MVC 處理常式中引入 **@PathVariable 註解以用於 URI 樣板處理**
  • 在 MVC 處理常式中引入 **@RequestParam 的預設值支援**
  • 在 MVC 處理常式中引入 **@RequestHeader 註解以用於 HTTP 標頭存取**
  • 引入 **AbstractAtomFeedView 和 AbstractRssFeedView** 基底類別
  • 引入 **<spring:url> 和 <spring:param>** JSP 標籤

以及各種小型的增強功能。

請注意,Spring Framework 3.0 需要 Java 5 或更高版本以及 J2EE 1.4 或更高版本。 我們正在以 Java 6 和 Java EE 5 作為主要平台層級進行建置 - 但請放心,我們將保留與啟用 Java 5 的 J2EE 1.4 伺服器(例如 WebLogic 9 和 WebSphere 6.1)的相容性。

我們也移除/棄用了幾個過時的類別。 更多資訊…

秘密揭曉 – tc Server 發佈

工程 | Peter Cooper-Ellis | 2008 年 12 月 04 日 | ...

我們在本週的 SpringOne Americas 會議上宣布了一項名為 SpringSource tc Server 的新產品。 Springsource tc Server 是一個基於 Apache Tomcat 的企業級 Web 應用程式伺服器。

雖然 SpringSource 並不是第一家圍繞 Apache Tomcat 建置產品的公司(WebSphere Community Edition 和 JBoss 都在其 J2EE 應用程式伺服器中嵌入了 Tomcat 的版本,並且 JBoss Web 2.1.1 的開發人員版本也嵌入了 Tomcat),但 tc Server 的獨特之處在於它保留了 Tomcat servlet/JSP 程式設計模型。 為 Tomcat 撰寫的應用程式 100% 可移植到…

在 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 部分中,我們從頭開始以 Eclipse 專案的形式建置了 GWT StockWatcher 範例應用程式,然後將程式碼產生到 Dynamic Web 專案中,然後將其部署到 dm Server 中。 最後,我們將 Dynamic Web 專案匯出到 WAR 檔案中,並在 STS 之外進行部署。

此處描述的逐步方法將建立在我們在 第 1 部分中所做的工作之上,而不是重新開始。 我們在 第 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 以範圍 [1.0, 1.0] 匯入 eclipselink,而 app2 以範圍 [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 衝突。 這表示 app2spring.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 匯出。 了解了這些知識,我們可以找出 2 套件中 spring.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 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"

安裝 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

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 約束又回來了。執行前一節中識別的診斷步驟在這裡沒有幫助,因為沒有相依約束不符 - 我們知道這一點,因為第一次這些 bundle 已經成功解析了。

這裡的問題是解析順序。這些 bundle 分兩個不同的部分安裝和解析。第一部分包括 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 無法解析,因為它需要 eclipselink2.0.0 版本,但 spring 已經連接到 eclipselink1.0.0 版本。當所有 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 旗下的第一個 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 已經收購了 G2One,這家公司是 GrailsGroovy 背後的推手。

為什麼?

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

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

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

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

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

簡介

這將是一個由 3 個部落格文章組成的系列,描述在 SpringSource dm Server™ 中建構和部署 GWT 應用程式的循序漸進方法。這些部落格文章的重點如下
  1. 在 dm Server 中建構和部署 GWT StockWatcher 範例應用程式作為 WAR 檔案,使用 SpringSource Tool Suite 從頭開始建構它。
  2. 使用 "共享程式庫" 方法進行部署:如何從 WAR 中移除 GWT 相依性,並將它們作為 OSGi bundle 部署在 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。我已經包含了您可以下載的壓縮專案,其中包含一個GWT_ROOT_INSTALL我定義的變數。要使用我的專案,當您導入它們時,請導覽至 "Preferences" -> "Java" -> "Build Path" -> "Classpath Variables" 並定義您自己的GWT_ROOT_INSTALL...

關於選舉的一句話

工程 | Rod Johnson | 2008 年 10 月 28 日 | ...

不,不是 11 月 4 日的 Obama/McCain 對決。正如您可能在 SD Times 中讀到的,SpringSource 已當選為 Java SE/EE 的 JCP 執行委員會成員,與 SAP、Ericsson、Nokia、Philips 和 IBM 一起。我將擔任 SpringSource 代表。

並非 JCP 符合總統競選的規模。但這對於 SpringSource 來說是一個重要的時刻,它反映了 SpringSource 整個團隊在企業 Java 中提供的多年辛勤工作和領導力。更重要的是,我相信我們的選舉將有助於我們使 Java 更加強大。

第一本書開始,一直到...

開始使用 SpringSource dm Server

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

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

昨晚我在 費城 Spring 使用者群組中介紹了 "SpringSource dm Server 簡介"。在這次演講中,我創建了一個名為 GreenPages 的小型應用程式,演示了 dm Server 的所有主要方面。我向與會者承諾,我將在此處發布該應用程式和投影片。

自從 dm Server 正式發布以來,過去幾週有很多人詢問關於開始使用 dm Server 的最佳方法,因此我撰寫這篇文章來收集所有相關資訊…

取得 Spring 電子報

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

訂閱

搶先一步

VMware 提供訓練和認證,以加速您的進程。

了解更多

取得支援

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

了解更多

即將舉辦的活動

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

查看全部