Maven的核心功能便是搭建项目间的依赖关系,通俗点讲,就是通过pom.xml文件的配置获取jar包,而不用手动去添加jar包,怎么通过pom.xml的配置就可以获取到jar包呢?pom.xml配置文件从何而来?等等类似问题我们需要搞清楚,如果需要使用pom.xml来获取jar包,那么首先该项目就必须为maven项目,maven项目可以这样去想,就是在java项目和web项目的上面包裹了一层maven,本质上java项目还是java项目,web项目还是web项目,但是包裹了maven之后,就可以使用maven提供的一些功能了(通过pom.xml添加jar包)。
第一步:
导入maven依赖发生了什么。
我们写了如下的一个pom依赖
通常情况下,我们利用 groupId、artifactId、version 标签来确认这个依赖的唯一坐标,就像我们在坐标系用YXZ来定位某一个点一样。
当我们拿到这个坐标之后去本地仓库找这个依赖(就是找jar包),本地仓库(每个电脑默认的仓库是在 $user.home/.m2/repository下)。没有就去私服仓库(一般是由公司自己设立的,只为本公司内部共享使用。它既可以作为公司内部构件协作和存档,也可作为公用类库镜像缓存,减少在外部访问和下载的频率。使用私服为了减少对中央仓库的访问,私服可以使用的是局域网,中央仓库必须使用外网,也就是一般公司都会创建这种第三方仓库,保证项目开发时,项目所需用的jar都从该仓库中拿,每个人的版本就都一样。注意:连接私服,需要单独配置。如果没有配置私服,默认不使用),没有再去中央仓库(就是网站repo1.maven.org/maven2)寻找,再…
第二步:
maven找到引入后,再讲下maven的生命周期。
maven的生命周期如下:maven的生命周期就如IDEA中显示的那样,顺序由上至下。
- clean: 移除所有上一次构建生成的文件
- validate:验证工程是否正确,所有需要的资源是否可用
- **compile:**编译项目的源代码
- **test:**使用合适的单元测试框架来测试已编译的源代码。这些测试不需要已打包和布署。
- **package:**把已编译的代码打包成可发布的格式,比如 jar、war 等。
- verify:运行所有检查,验证包是否有效且达到质量标准。
- **install:**把包安装到maven本地仓库,可以被其他工程作为依赖来使用
- site: 生成项目的站点文档
- deploy:在集成或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。
注意一点**:**从下到下是由一个执行包含关系,比如我执行clean,就只会执行clean功能,移除构建文件。但是如果我执行compile,那它就会执行clean、validate、compile三条命令。
第三步
最后再讲一下maven如何排除依赖,这也是平时使用maven比较头疼的一点。
方法一:使用IDEA插件maven helper。
不会还有人不会下载使用IDEA插件吧, 不会吧,不会吧。
maven helper插件安装成功,点开pom.xml会发现多了一个Dependency Analyzer视图,如下:
上面按钮的图标含义如下
- Conflicts(查看冲突)
- All Dependencies as List(列表形式查看所有依赖)
- All Dependencies as Tree(树形式查看所有依赖)
上图说明有3个jar存在冲突,点击冲突的jar,可以查看和哪个jar产生冲突,如下图
方法二:在IDEA下的Terminal下输入如下命令:mvn -Dverbose dependency:tree
(maven已经添加环境依赖为前提)
就可以看到该项目的依赖树了,如下:
出现这种的就是出现了依赖冲突,有些并不会报错,除非你是处女座看不惯,否者没必要去除。
发现了冲突,怎么解决呢?
方法一:
<dependency>
<groupId>com.juejin.business</groupId>
<artifactId>juejin-image-web</artifactId>
<version>1.0.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>com.juejin.business</groupId>
<artifactId>juejin-convert-web</artifactId>
</exclusion>
</exclusions>
</dependency>
复制代码
方法二:
<dependency>
<groupId>com.juejin.business</groupId>
<artifactId>juejin-convert-web</artifactId>
<version>1.0.0-SNAPSHOT</version>
<optional>true</optional>
</dependency>
复制代码
下班时间到了,就写到这吧,下次再讲。