什么是依赖
依赖的作用可以将项目以包的方式引用到当前项目中进行使用。 实际上平时引用的jar包都看可以看成是一个个子项目被引入到了项目中。
项目引用
也就是把其他的项目当成jar包放入仓库中,进行依赖的引用,就跟从网上下载jar包到本地一样。 被项目在被引用前必须先 clean install 到仓库中。
引用示例
创建一个maven项目,在 pom.xml 中添加一个项目引用,这里引用一个外部项目 junit,用它来构建测试用例,这里仅作为项目引用的示例。
代码语言:javascript复制<?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
代码语言:javascript复制<?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
代码语言:javascript复制<?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 当中的类。
依赖范围
有几种项目类型
- compile: 默认
- test: 不被传递
- system: 本系统
- optional:可选依赖
实际开发中,并不是需要的包都需要被依赖,有些包只需要在本项目中进行依赖,并不需要被外部引用到如测试用到的包,这是候就可以选 test 类型。
代码语言:javascript复制<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 属性:
- test: 测试的时候需要这个依赖,编译、打包、发布这个依赖都不会被生效。比如junit。
- compile: 编译、打包有效,其他都无效。
- runtime: 运行时有效,其他都无效。
- provided: 编译和测试过程中有效,最后生成war不会加入依赖,如servlet-api tomcat有带,打包时就没必要了,只在测试时添加就可以了。
- system: 特殊,这个使用的时本地的依赖,不使用maven仓库。
默认是compile。假设如果,scope是依test,不会产生依赖。
总结
项目依赖是管理项目非常用的方式,也非常简便,实际开发中非常常用这种方式。但是如果多项目中的引用存在不同的版本,也会产生版本引用冲突,maven 一般是通过就近原则解决这个问题,我们也可以通过排除不需要的项目依赖来解决这个问题。