如何在Maven中配置Spring依赖

如何在Maven中配置Spring依赖,第1张

在Maven中Spring的基础配置

Spring是高度模块化的,可以单独使用Spring的某个库而不需要依赖Spring的其他库。比如,使用Spring Context库不需要依赖Spring Persistence或者Spring MVC库。

让我们先从最简单开始,在Maven中配置spring-context依赖:

12345678910<properties> <org.springframework.version>3.2.8.RELEASE</org.springframework.version> <!-- <org.springframework.version>4.0.2.RELEASE</org.springframework.version>--></properties><dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework.version}</version> <scope>runtime</scope></dependency>

上例定义的对spring-context的依赖,spring-context实现了Spring注入容器并且依赖:spring-core,spring-expression,spring-aop以及spring-beans。这些依赖包使容器可以支持Spring的一些核心技术:Spring核心组件,Spring EL表达式 (SpEL), 面向切面编程,JavaBean机制。

注意,在runtime范围定义这个依赖,因此需求确定在编译期间不需要依赖相关Spring特定的API。在一些高级应用场景下,一些Spring依赖项可以不用配置runtime范围,但是在目前比较简单的项目场景下,不需要针对Spring编译项目去获得整个框架的全部功能。

同样要注意的是,从Spring 3.2开始不需要定义CGLIB依赖(目前的版本是CGLIB 3.0)。现在使用内嵌在spring-core JAR(更多详细信息可以查看相关[JIRA]https://jira.springsource.org/browse/SPR-9669("JIRA")中的cglib包(net.sf.cglib现在使用org.springframework.cglib替代)。

1.1 spring-security-core

Spring Security的核心功能是由spring-security-core包提供的,包含了认证和访问控制功能、支持standalone应用程序、方法级安全和JDBC支持。

<properties>

<org.springframework.security.version>3.2.3.RELEASE</org.springframework.security.version>

<org.springframework.version>4.0.4.RELEASE</org.springframework.version>

</properties>

<dependency>

<groupId>org.springframework.security</groupId>

<artifactId>spring-security-core</artifactId>

<version>${org.springframework.security.version}</version>

</dependency>

注意:我们使用的是3.2.x版本的Spring Security--Spring和Spring Security有着不同的版本计划,所以他们的版本号之间没有一对一关系。

如果项目使用的是较老版本的Spring,需要注意的时Spring Security 3.1.x版本不依赖于Spring 3.1.x版本,因为Spring Security 3.1.x版本在Spring 3.1之前发布。Spring的计划是在后续的版本中,使双方的版本号更为接近,更多细节请查看这个JIRA。我们将在后面的内容中看看这种情况对我们的实际影响。

1.2 spring-security-web

要为Spring Security增加Web支持,需要引入spring-security-web依赖:

<dependency>

<groupId>org.springframework.security</groupId>

<artifactId>spring-security-web</artifactId>

<version>${org.springframework.security.version}</version>

</dependency>

这个项目为Servlet环境引入了针对URL访问控制的相关基础安全组件和过滤器。

1.3 Spring Security与较老版本的Spring Core之间的依赖问题

如上文所述,这个新的依赖产生一个Maven依赖关系问题,Spring Security的相关jar不依赖于最新的Spring core的jar (而是以前的版本)。这可能使的被依赖的Spring core相关包在类路径中被配置前在最新的Spring 4.x相关包的前面。

这是如何发生的呢?我们需要了解Maven处理版本冲突的机制,Maven会选择与依赖树树根最接近的版本。在之前的情况中,spring-orm依赖4.x版本的spring-core,而spring-security-core依赖于3.2.8版本的spring-core。因此,spring-orm和sprint-security-web的定义顺序就是一个问题,先定义的会有更高的优先级。最终情况就是,我们的类路径中会有两个版本的spring-core。

为了避免这类问题,我们需要在我们的pom文件中明确指定一些Spring依赖,而不依靠Maven隐式依赖机制。我们将在pom的根文件中定义特定的依赖关系,这样这些依赖关系将会有更高的优先级。下面例子中,将对所有的Spring核心组件明确定义相同的版本,对于多模块项目,需要在父配置文件的dependencyManagement属性中定义。

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-core</artifactId>

<version>${org.springframework.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>${org.springframework.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-jdbc</artifactId>

<version>${org.springframework.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-beans</artifactId>

<version>${org.springframework.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-aop</artifactId>

<version>${org.springframework.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-tx</artifactId>

<version>${org.springframework.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-expression</artifactId>

<version>${org.springframework.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-web</artifactId>

<version>${org.springframework.version}</version>

</dependency>

1.4 spring-security-config及其他

要使用丰富的Spring Security XML的命名空间,需要定义spring-security-config依赖:

<dependency>

<groupId>org.springframework.security</groupId>

<artifactId>spring-security-config</artifactId>

<version>${org.springframework.security.version}</version>

<scope>runtime</scope>

</dependency>

没有任何代码需要在编译时依赖这个包,所以它的范围应该定义为runtime。

最后,LDAP、ACL、CAS和OpenID支持需要分别增加各自的依赖包:spring-security-ldap, spring-security-acl, spring-security-cas和spring-security-openid。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11479913.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存