Charming 的博客

Maven 引入 Spring 依赖的最佳方法

在用 Spring 开发项目的时候,需要引入 Spring 的多个依赖。

通常的做法

1
2
3
4
5
6
7
8
9
10
11
12
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.5.RELEASE</version>
</dependency>
</dependencies>

为了不重复,也会把 version 里面的版本号换成一个变量,比如:

1
2
3
<properties>
<spring.version>4.3.5.RELEASE</spring.version>
</properties>

其实 Spring 官方还有更好的方法。

Spring Framework 的官方参考文档是怎么做的?

Spring Framework 的官方参考文档中有一小节—— Maven “Bill Of Materials” Dependency(翻译成中文就是”Maven 物料清单依赖”),能够解决你在项目中可能因为引入不同版本 Spring JARs 而导致的问题。

  1. 首先在 pom.xml 加入以下代码;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-framework-bom</artifactId>
    <version>4.3.5.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
    </dependency>
    </dependencies>
    </dependencyManagement>
  2. 不需要 <version> 标签就能引入 Spring JARs,版本号和上面的一样;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <dependencies>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    </dependency>
    <dependencies>

进一步观察

  • 第一个步骤是用了 Maven 的 <dependencyManagement> 标签,它能够让整个项目引入的依赖与 <dependencyManagement> 标签里面的依赖版本一致,这也是为什么之后引入 spring 相关的依赖不需要加入 <version> 属性了;
  • spring-framework-bom 的 type 是 pom,查看这个项目的 pom.xml 文件 ,会发现里面也是 <dependencyManagement> 标签,下面指定了一系列 spring 依赖的版本号;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.5.RELEASE</version>
</dependency>
...
</dependencies>
</dependencyManagement>
  • 第一个步骤中 spring-framework-bom 的 scope 是 import
    • 发散一下,我们也可以做一个自己项目的”物料清单”,将常用的库比如说 commons-lang3guava 这样的项目做成一个物料清单,然后以类似 spring 物料清单的方式引入到别的项目中,这样项目在加入 commons-lang3 这样的依赖的时候就不需要在加入 <version> 属性了;

导入 Spring 依赖完整的 pom.xml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<project xmlns="...">
...
<properties>
<spring.version>4.2.8.RELEASE</spring.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- spring-framework 所有同版本的模块 import 进来 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>${spring.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>