什么是依赖

依赖的作用可以将项目以包的方式引用到当前项目中进行使用。
实际上平时引用的jar包都看可以看成是一个个子项目被引入到了项目中。

项目引用

也就是把其他的项目当成jar包放入仓库中,进行依赖的引用,就跟从网上下载jar包到本地一样。
被项目在被引用前必须先 clean install 到仓库中。

引用示例

创建一个maven项目,在 pom.xml 中添加一个项目引用,这里引用一个外部项目 junit,用它来构建测试用例,这里仅作为项目引用的示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.example</groupId>
<artifactId>project01</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
</dependency>
</dependencies>
</project>

添加完成后,项目中就出现这个依赖包。

项目依赖

跨项目调用类

日常开发中,不会只针对一个项目开发,会针对不同项目进行开发。

例如:
project03 要引用 project01 和 project02 时,project01 和 project02必须先打包发布到了本地仓库中。
project03在pom.xml中添加依赖,这样project01 和 project02 就都被当做依赖打成了jar包入进 project03 的 Maven Library 中。
project03 还会自动得到project01、project02中的所引用的jar包,这叫依赖传递。

project01 中所包含的包:junit,也会被project03续承。

project03

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.liukai</groupId>
<artifactId>project03</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
<dependency>
<groupId>com.liukai</groupId>
<artifactId>project01</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>

</project>

project01

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.liukai</groupId>
<artifactId>project01</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
</dependency>
</dependencies>
</project>

显示的效果

依赖传递

依赖传递可以是链条式的一个引一个:
project01--->project02--->project03

同理,project03 也可以使用 project01 当中的类。

依赖范围

有几种项目类型

  1. compile: 默认
  2. test: 不被传递
  3. system: 本系统
  4. optional:可选依赖

实际开发中,并不是需要的包都需要被依赖,有些包只需要在本项目中进行依赖,并不需要被外部引用到如测试用到的包,这是候就可以选 test 类型。

1
2
3
4
5
6
7
8
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>

dependencies

是在project元素下项目管理元素,在这标签下添加的项目座标会自动添加到项目中。
dependency 包含元素:

  • type:依赖类型,对应于项目座标的packageing,一般不写。
  • scope:依赖范围
  • doptional:标记依赖是赖可选
  • exclusions:用来排除传递性依赖

scope 属性:

  1. test: 测试的时候需要这个依赖,编译、打包、发布这个依赖都不会被生效。比如junit。
  2. compile: 编译、打包有效,其他都无效。
  3. runtime: 运行时有效,其他都无效。
  4. provided: 编译和测试过程中有效,最后生成war不会加入依赖,如servlet-api tomcat有带,打包时就没必要了,只在测试时添加就可以了。
  5. system: 特殊,这个使用的时本地的依赖,不使用maven仓库。

默认是compile。假设如果,scope是依test,不会产生依赖。

总结

项目依赖是管理项目非常用的方式,也非常简便,实际开发中非常常用这种方式。但是如果多项目中的引用存在不同的版本,也会产生版本引用冲突,maven 一般是通过就近原则解决这个问题,我们也可以通过排除不需要的项目依赖来解决这个问题。