使用 Maven 獲取 Spring 3 工件

工程 | Keith Donald | 2009年12月2日 | ...

一位最近的評論者在這裡抱怨道:“只有一半的人在使用 Maven”,並指出如何使用 Maven 獲取 Spring 3 工件並不明顯。在這篇文章中,我將向您展示如何做到這一點以及有哪些選項。這些資訊也將整合到即將釋出的 Spring 3 最終版本的參考文件中。

釋出 Spring 工件的 Maven 倉庫

通常,Spring 將其工件釋出到兩個不同的地方

  1. Maven Central,這是 Maven 查詢的預設倉庫,無需任何特殊配置即可使用
  2. 企業捆綁包倉庫 (EBR),由 SpringSource 執行,也託管所有與 Spring 整合的庫

因此,當使用 Maven 獲取 Spring 時,您需要決定的第一件事是從哪個地方獲取它。一般來說,如果您關心 OSGi,請使用 EBR,因為它包含所有 Spring 依賴項(例如 Hibernate 和 Freemarker)的 OSGi 相容構件。如果 OSGi 對您不重要,那麼兩者都可以,儘管它們之間有一些優缺點。通常,為您的專案選擇一個地方;不要混合使用它們。這一點尤其重要,因為 EBR 構件使用的命名約定與 Maven Central 構件不同。

下面是一個表格,比較了 Maven Central 和 EBR 在幾個方面的表現

特性 Maven Central 企業包儲存庫 (EBR)
OSGi 相容
構件數量 數萬個;各種各樣 數百個;Spring 整合/支援的那些
所有構件的命名約定是否一致?
構件命名約定 Group id 各不相同;較新的構件使用域名,例如“org.sl4j”;較舊的構件使用構件 ID,例如“log4j” Artifact id 各不相同;通常是 JAR 檔名減去副檔名,例如“log4j” Version 各不相同;大多數使用數字和點,例如“3.0.0” Group id <域名>,例如“org.springframework” Artifact id <Bundle-SymbolicName>,源自主包,例如“org.springframework.beans”。如果 JAR 必須修補以確保 OSGi 相容性,則會新增“com.springsource.”字首,例如“com.springsource.org.apache.log4j” Version OSGi 版本號格式為 <major>.<minor>.<micro>[.qualifier],例如“3.0.0.RC3”
釋出 自動(透過遠端倉庫進行 rSync) 手動(由 SpringSource 處理 JIRA)
質量保證 我所知道的沒有;準確性是釋出組織的責任 廣泛(針對 MANIFEST.mf 和 .pom);由 Spring 團隊執行質量保證
託管 由 Sonatype 資助的 @ Contegix,帶多個映象 由 SpringSource 資助的 S3
搜尋工具 各種 www.springsource.com/repository
與 SpringSource 工具(STS、Roo 等)整合 是的,與 STS 和 Roo 是的,與 STS

既然您知道了這些選項,我將討論如何從這兩個地方獲取 Spring 構件。

從 Maven Central 獲取 Spring 版本

您不必將倉庫新增到 .pom 中即可從 Maven Central 獲取 Spring 專案的最終版本。只需新增您的專案所需的依賴項即可。

下面列出了每個 Spring Framework 3 構件在 Maven Central 中索引時的 .pom <dependency> 片段。



<!-- Shared version number properties -->
<properties>
    <org.springframework.version>3.0.5.RELEASE</org.springframework.version>
</properties>

<!--
    Core utilities used by other modules.
    Define this if you use Spring Utility APIs (org.springframework.core.*/org.springframework.util.*)
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Expression Language (depends on spring-core)
    Define this if you use Spring Expression APIs (org.springframework.expression.*)
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-expression</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!-- 
    Bean Factory and JavaBeans utilities (depends on spring-core)
    Define this if you use Spring Bean APIs (org.springframework.beans.*) 
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-beans</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Aspect Oriented Programming (AOP) Framework (depends on spring-core, spring-beans)
    Define this if you use Spring AOP APIs (org.springframework.aop.*)
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aop</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Application Context (depends on spring-core, spring-expression, spring-aop, spring-beans) 
    This is the central artifact for Spring's Dependency Injection Container and is generally always defined
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Various Application Context utilities, including EhCache, JavaMail, Quartz, and Freemarker integration
    Define this if you need any of these integrations
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context-support</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Transaction Management Abstraction (depends on spring-core, spring-beans, spring-aop, spring-context)
    Define this if you use Spring Transactions or DAO Exception Hierarchy
    (org.springframework.transaction.*/org.springframework.dao.*)
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-tx</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    JDBC Data Access Library (depends on spring-core, spring-beans, spring-context, spring-tx)
    Define this if you use Spring's JdbcTemplate API (org.springframework.jdbc.*)
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Object-to-Relation-Mapping (ORM) integration with Hibernate, JPA, and iBatis.
    (depends on spring-core, spring-beans, spring-context, spring-tx)
    Define this if you need ORM (org.springframework.orm.*)
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-orm</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Object-to-XML Mapping (OXM) abstraction and integration with JAXB, JiBX, Castor, XStream, and XML Beans.
    (depends on spring-core, spring-beans, spring-context)
    Define this if you need OXM (org.springframework.oxm.*)
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-oxm</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Web application development utilities applicable to both Servlet and Portlet Environments
    (depends on spring-core, spring-beans, spring-context)
    Define this if you use Spring MVC, or wish to use Struts, JSF, or another web framework with Spring (org.springframework.web.*)
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Spring MVC for Servlet Environments (depends on spring-core, spring-beans, spring-context, spring-web)
    Define this if you use Spring MVC with a Servlet Container such as Apache Tomcat (org.springframework.web.servlet.*)
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Spring MVC for Portlet Environments (depends on spring-core, spring-beans, spring-context, spring-web)
    Define this if you use Spring MVC with a Portlet Container (org.springframework.web.portlet.*)
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc-portlet</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Support for testing Spring applications with tools such as JUnit and TestNG
    This artifact is generally always defined with a 'test' scope for the integration testing framework and unit testing stubs
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-test</artifactId>
  <version>${org.springframework.version}</version>
  <scope>test</scope>
</dependency>

從企業包儲存庫 (EBR) 獲取 Spring 版本

要從 EBR 獲取 Spring 專案的最終版本,請將以下倉庫新增到您的 .pom 中


<repository>
    <id>com.springsource.repository.bundles.release</id>
    <name>EBR Spring Release Repository</name>
    <url>http:// repository.springsource.com/maven/bundles/release</url>
</repository>
<repository>
    <id>com.springsource.repository.bundles.external</id>
    <name>EBR External Release Repository</name>
    <url>http:// repository.springsource.com/maven/bundles/external</url>
</repository>

然後只需新增您的專案所需的依賴項,同時記住 EBR 構件命名約定。

下面列出了每個 Spring Framework 3 構件在 EBR 中索引時的 .pom <dependency> 片段



<!-- Shared version number properties -->
<properties>
    <org.springframework.version>3.0.0.RELEASE</org.springframework.version>
</properties>

<!--
    Core utilities used by other modules.
    Define this if you use Spring Utility APIs (org.springframework.core.*/org.springframework.util.*)
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>org.springframework.core</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Expression Language (depends on core)
    Define this if you use Spring Expression APIs (org.springframework.expression.*)
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>org.springframework.expression</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!-- 
    Bean Factory and JavaBeans utilities (depends on core)
    Define this if you use Spring Bean APIs (org.springframework.beans.*) 
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>org.springframework.beans</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Aspect Oriented Programming (AOP) Framework (depends on core, beans)
    Define this if you use Spring AOP APIs (org.springframework.aop.*)
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>org.springframework.aop</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Application Context (depends on core, expression, aop, beans) 
    This is the central artifact for Spring's Dependency Injection Container and is generally always defined
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>org.springframework.context</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Various Application Context utilities, including EhCache, JavaMail, Quartz, and Freemarker integration
    Define this if you need any of these integrations
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>org.springframework.context.support</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Transaction Management Abstraction (depends on core, beans, aop, context)
    Define this if you use Spring Transactions or DAO Exception Hierarchy
    (org.springframework.transaction.*/org.springframework.dao.*)
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>org.springframework.transaction</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    JDBC Data Access Library (depends on core, beans, context, transaction)
    Define this if you use Spring's JdbcTemplate API (org.springframework.jdbc.*)
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>org.springframework.jdbc</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Object-to-Relation-Mapping (ORM) integration with Hibernate, JPA, and iBatis.
    (depends on core, beans, context, transaction)
    Define this if you need ORM (org.springframework.orm.*)
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>org.springframework.orm</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Object-to-XML Mapping (OXM) abstraction and integration with JAXB, JiBX, Castor, XStream, and XML Beans.
    (depends on core, beans, context)
    Define this if you need OXM (org.springframework.oxm.*)
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>org.springframework.oxm</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Web app development utilities common across Servlet/Portlet environments (depends on core, beans, context)
    Define this if you use Spring MVC, or wish to use Struts, JSF, or another web framework with Spring (org.springframework.web.*)
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>org.springframework.web</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Spring MVC for Servlet Environments (depends on core, beans, context, web)
    Define this if you use Spring MVC with a Servlet Container such as Apache Tomcat (org.springframework.web.servlet.*)
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>org.springframework.web.servlet</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Spring MVC for Portlet Environments (depends on core, beans, context, web)
    Define this if you use Spring MVC with a Portlet Container (org.springframework.web.portlet.*)
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>org.springframework.web.portlet</artifactId>
  <version>${org.springframework.version}</version>
</dependency>

<!--
    Support for testing Spring applications with tools such as JUnit and TestNG
    This artifact is generally always defined with a 'test' scope for the integration testing framework and unit testing stubs
-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>org.springframework.test</artifactId>
  <version>${org.springframework.version}</version>
  <scope>test</scope>
</dependency>

獲取 Spring 里程碑版本

里程碑和釋出候選版本可能不會直接釋出到 Maven Central,通常與最終版本分開發布。SpringSource 託管了兩個用於獲取 Spring 里程碑的倉庫。第一個應與 Maven Central 結合使用,第二個應與 EBR 結合使用。

從 Maven Central 相容倉庫獲取里程碑

要從 Maven Central 相容倉庫獲取 Spring 里程碑,請將以下倉庫新增到您的 .pom 中


<repository>
    <id>org.springframework.maven.milestone</id>
    <name>Maven Central Compatible Spring Milestone Repository</name>
    <url>http:// maven.springframework.org/milestone</url>
</repository>

里程碑版本號格式為 <major>.<minor>.<micro>.M#;例如,3.0.0.M4。釋出候選版本號格式為 <major>.<minor>.<micro>.RC#;例如,3.0.0.RC3。

例如,新增以下依賴項將檢索 spring-context 構件的 3.0.0.RC3 版本


<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>3.0.0.RC3</version>
</dependency>

從企業包儲存庫 (EBR) 獲取里程碑

要從 EBR 獲取 Spring 里程碑,請將以下倉庫新增到您的 .pom 中


<repository>
    <id>com.springsource.repository.bundles.milestone</id>
    <name>EBR Spring Milestone Repository</name>
    <url>http:// repository.springsource.com/maven/bundles/milestone</url>
</repository>

務必記住獨特的 EBR 構件命名約定。例如,新增以下依賴項將檢索 org.springframework.context 構件的 3.0.0.RC3 版本


<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>org.springframework.context</artifactId>
  <version>3.0.0.RC3</version>
</dependency>

獲取每晚 Spring 快照

Spring 專案的快照每天釋出,允許使用者在下一個版本釋出之前驗證報告的問題是否已解決。與里程碑一樣,有一個單獨的 Maven Central 相容快照倉庫和一個 EBR 快照倉庫。

從 Maven Central 相容倉庫獲取快照

要從 Maven Central 相容倉庫獲取 Spring 每晚快照,請將以下倉庫新增到您的 .pom 中


<repository>
    <id>org.springframework.maven.snapshot</id>
    <name>Maven Central Compatible Spring Snapshot Repository</name>
    <url>http:// maven.springframework.org/snapshot</url>
</repository>

快照版本格式為 <major>.<minor>.<micro>.BUILD-SNAPSHOT;例如,3.0.1.BUILD-SNAPSHOT。

例如,新增以下依賴項將檢索 spring-context 構件的最新快照


<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>3.0.1.BUILD-SNAPSHOT</version>
</dependency>

請注意,<major>.<minor>.<micro>.BUILD-SNAPSHOT 格式與傳統的 Maven 2 快照格式 <major>.<minor>.<micro>-SNAPSHOT 略有不同。這是因為 x.y.z-SNAPSHOT 不是有效的 OSGi 版本號。所有 Spring 專案現在都遵循OSGi 版本編號方案(Maven 3 也會)。

從企業包儲存庫 (EBR) 獲取快照

要從 EBR 獲取 Spring 每晚快照,請將以下倉庫新增到您的 .pom 中


<repository>
    <id>com.springsource.repository.bundles.snapshot</id>
    <name>EBR Spring Snapshot Repository</name>
    <url>http:// repository.springsource.com/maven/bundles/snapshot</url>
</repository>

最後一個例子是,新增以下依賴項將檢索 org.springframework.context 構件的最新快照


<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>org.springframework.context</artifactId>
  <version>3.0.1.BUILD-SNAPSHOT</version>
</dependency>

Spring 專案生產力工具

最後我想簡要介紹一下 Spring 為使用 Maven 的專案提供的工具。SpringSource Tool Suite 和 Spring Roo 都提供了嚮導,可以生成帶有預配置 .pom 的新 Spring 專案。Roo 在這方面做得很好——當您執行需要下載額外構件的程式碼生成命令時,它實際上可以為您管理 .pom。

Cloud Foundry 還具有一項新功能,允許在沒有外部依賴項的情況下進行雲部署,大大縮短了部署時間。為了實現這一點,Cloud Foundry 在釋出後與 EBR 同步以完成部署。

總結

哎呀,要介紹的內容真多。

這是一篇很長的文章,但總而言之,我希望現在清楚如何使用 Maven 獲取 Spring 構件,無論您是尋找最終版本、里程碑版本、釋出候選版本還是每晚快照。讓 Spring 易於獲取對我們來說非常重要。在專案的里程碑階段尤其重要,此時使用者首次嘗試新功能,並有機會直接影響 Spring 的發展方向。

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有