文章目录
上篇我们聊了Maven是什么以及Maven是通过四个标签:
groupId
、
artifactId
、
version
、
packaging
将自己标记为全球唯一的。接下来我们这篇文章将要聊一聊依赖管理!
依赖配置
依赖也是同样用一个标签来标记的,这个标签就是dependency
,上文聊了使用groupId
、artifactId
、version
能够在*仓库中确定唯一一个包,所以理所当然的就是在dependency
中定义这三个标签来实现引入一个坐标,我们以springboot-web
为例,如果想新入一个2.3.2版本的springboot-web
就可以写成下面这样。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>
非常简单,3行代码就代替了我们花十几分钟从互联网上下载jar包。那如果我想要引入很多依赖怎么办?当然是引入多个dependency
!但是这里需要注意的是dependency
需要用dependencies
来包裹,告诉maven我这里面都是要引用的依赖,需要你去下载。
我们在上面的基础上再引入一个mysql
的效果就是这样的:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
maven有关于依赖部份最主要的配置方式都已经介绍完毕,不过还有一些非常重要的依赖标签需要我们去了解。
maven生命周期
在了解这些标签之前我们需要明确maven生命周期,maven的生命周期主要分为三个部分:clean、default和site。这三个周期包括了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署、生成站点等几乎所有的构建步骤。
值得一提的是,maven的生命周期是非常灵活的,三个生命周期是相互独立的,我们可以单独执行生命周期的某一个阶段或者某一个阶段的某一个时刻。接下来我们就一点点介绍三个生命周期。
clean生命周期
clean生命周期主要是对项目进行一些清理,比如说清理上一次构建所产生的文件等等。clean生命周期一共包含三个阶段:pre-clean、clean、post-clean,不过一般我们就当作一个阶段来看。
default生命周期
default生命周期是maven最主要的一个生命周期,这里面几乎包含了构建的所有步骤。我们一个个来看【加粗的为重要步骤】:
- validate:验证性的周期,主要验证工程的正确性和资源的可用性
- initialize:初始化构建状态
- generate-sources:生成源代码
- process-sources:处理主资源文件:一般是对src/main/resources中的内容进行变量替换等工作,然后复制项目到主输出目录的classpath中
- generate-resources:生成主资源文件
- process-resources:处理资源文件
- compile:编译
- process-classes:处理编译生成的文件
- generate-test-sources:生成测试源代码
- process-test-sources:处理项目测试的资源文件:一般是对src/test/resources中的内容进行变量替换等工作,然后复制项目到测试输出目录的classpath中
- generate-test-resources:生成测试资源文件
- process-test-resources:处理测试资源为
- test-compile:编译测试源码
- process-test-classes:处理测试编译生成的文件
- test:进行单元测试
- prepare-package:打包前准备工作
- package:将编译好的源码打包成二进制文件,比如jar
- pre-integration-test:集成测试前
- integration-test:集成测试
- post-integration-test:集成测试后
- verify:验证
- install:将打好的包安装到本地的Maven仓库
- deploy:将打好的包安装到远程的Maven仓库
site生命周期
site生命周期比较抽象的解释是说生产站点文档并发布,其实就是生成一个说明文档,这些文档可以被浏览器解释,现在基本没有人用。
依赖配置的其他标签
scope
scope选项就是控制依赖在生命周期中的表现,scope一共有以下几个选项。
- compile:compile是scope的默认选项,他代表此依赖需要参与整个周期,包括:编译、测试、运行。
- test:test代表此依赖只有在运行单元测试时才被使用,junit一般会使用这个scope。
- runntime:runntime代表依赖不需要在编译时引入,但是在测试和运行时需要使用。这种情况在不同实现的情况下很好用,比如mysql、oracle的驱动就很适合这种情况,因为他们都是JDBC的具体实现。
- provided:provided是很特殊的一种情况,他代表的是在构建时不需要将这个依赖打包,在使用时会有外部的提供。
- system:system与provided差不多,只不过是需要在系统中获取。
当然scope也是可以随着依赖进行传递的,具体的表现如下:
规定:在A依赖于B,B依赖于C
的情况下:
- B为A的第一依赖
- C为B的第二依赖
- C为A的传递依赖
第一\传递\第二 | compile | test | provided | runtime |
---|---|---|---|---|
compile | compile | runtime | ||
test | test | test | ||
provided | provided | provided | provided | |
runtime | runtime | runtime |
classifier
classifier 可以是任意的字符串,这里主要是用于对一个jar包进行特殊的标记。比如说一个依赖是a-1.2.3-jdk8.jar
的classifier就是jdk8
,a-1.2.3-jdk11.jar
,他的classifier就是jdk11
。
optional
optional的值为true和false,当为true时代表这个依赖是可选的,如果需要使用这个依赖,则需要显示的引入此包。
还以数据库举例子,比如说我做了一个对各种数据库进行操作的依赖A,A里面自然就包含各种数据库的依赖,例如mysql、oracle、H2等等,我将这些依赖都设置为optional且为true,这样在打包的时候就不会将其打进我的依赖包中,这里的好处就是我打出来的jar包很小,同时也不会发生依赖冲突这种烦人的问题。当我在B项目中想通过依赖A来使用Mysql时,只需要显示的引入Mysql的依赖即可。
systemPath
这个选项很简单,如果使用的是我们自己开发的工具包,而且也没有上传到maven*仓库中,这个时候如果想引用这个包就可以通过systemPath来指定依赖所在的路径。
不过需要注意的是,如果想使用systemPath必须要设置scope为system。
type
type也很简单,这里一般用于规定依赖的二进制类型,比如jar、war。这里默认是jar。
exclusions
这个标签主要用于排除依赖所依赖的依赖。比如我已经引入依赖1.1版本的A和1.2版本的依赖B,但是依赖A中引用了一个1.1版本的B与我的1.2版本有冲突,这个时候就可以使用exclusions在依赖A中将依赖B排除掉来解决冲突。
小结
最后我们通过一个具体的dependency来对所有的配置项进行归类,如下:
<dependency>
<groupId>org.example.demo</groupId>
<artifactId>MavenDemo</artifactId>
<version>1.1.1-SNAPSHOT</version><!-- 版本号 -->
<type>jar</type><!-- 依赖类型 -->
<classifier></classifier><!-- 依赖的分类字符 -->
<scope>test</scope><!-- 依赖范围:compile、provided、runtime、test、system、systemPath、optional -->
<optional>true</optional><!-- 可选依赖 -->
<systemPath></systemPath><!-- 自定义依赖的绝对路径 -->
<exclusions><!-- 需要排除的依赖 -->
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
以上就是本篇文章的全部内容,如果你觉得文章写得不错,求点赞,求转发。欢迎关注公众号(高压锅码农777)点击右下角联系作者,一起交流学习。
我是锅哥,祝你幸福,我们下期见。