使用 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 集成/支持的那些
所有工件的一致命名约定?
工件命名约定 组 ID 变化;较新的工件使用域名,例如“org.sl4j”;较旧的工件使用工件 ID,例如“log4j” 工件 ID 变化;通常是 JAR 文件名减去扩展名,例如“log4j” 版本 变化;大多数使用数字和点,例如“3.0.0” 组 ID <域名> 例如“org.springframework” 工件 ID <Bundle-SymbolicName>,源自主包,例如“org.springframework.beans”。如果必须修补 JAR 以确保 OSGi 兼容性,则会添加前缀“com.springsource.”,例如“com.springsource.org.apache.log4j” 版本 OSGi 版本号格式为 <major>.<minor>.<micro>[.qualifier] 例如“3.0.0.RC3”
发布 自动(通过远程仓库进行 rSync) 手动(SpringSource 处理的 JIRA)
质量保证 我所知无;准确性是发布组织的责任 广泛(针对 MANIFEST.mf 和 .pom);QA 由 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 工件的 .pom <dependency> 代码段,因为它将在 Maven Central 中编入索引。



<!-- 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 工件的 .pom <dependency> 代码段,因为它将在 EBR 中编入索引



<!-- 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 社区中所有即将举行的活动。

查看全部