本文基于企业内部开发时使用到的maven知识点总结,便于开发时查阅使用,非权威文档,仅供参考。
一、初识pom.xml
每个pom文件开头一般都有如下一段配置
<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.pxjy.puxin.preferential</groupId>
<artifactId>puxin-preferential</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>demo</name>
- project pom文件顶层元素
- modelVersion pom本身版本号一般很少变
- groupId 项目的公司或组织一般为公司域名倒序
- artifactId 一般指项目的唯一标志
- version 项目版本号
- packaging 打包方式,一般为jar或war
- name 项目名称,一般生成项目的描述文档时需要
- url 项目文档下载的站点url
- description 项目描述
二、maven依赖管理基础
再上一段配置
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
</dependencies>
1、理解maven的坐标
groupId + artifactId + version + packaging + classifier,五个维度的坐标,唯一定位一个依赖包,
实际中后面两个维度使用较少,99%的场景下groupId + artifactId + version
在pom文件的dependency标签中配置了groupId,artifactId,version后maven会自动从中央仓库或镜像仓库下载坐标对应的jar包到本地缓存中
-
企业级坐标设置
groupId 一般设置为公司或组织的域名倒序 如www.baidu.com就是com.baidu开头
artfactId 某个项目、服务、模块,依据项目大小而定
version 版本号
classifier 某个项目的附属项目 如hello-world.jar的hello-world-source.jar
packaging jar包或war包
-
坐标设置的意义
- 便于依赖方定位并下载已发布的jar包
2、dependency属性详解
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<type></type>
<scope></scope>
<optional></optional>
</dependency>
前三项上面已做说明
type 一般不使用
-
scope 依赖包在不同的classpath下的作用范围,有如下几种配置
-
compile
不配置时默认的作用范围,对test、provided、runtime三个classpath都有效
-
test
仅对运行测试代码的classpath有用,单元测试依赖的包使用,如junit
-
provided
对编译和测试的classpath有效,线上运行时不需要,如servlet-api,在线上运行时一般web容器会自带,所以不需要
-
runtime
对测试和运行的classpath有效,编译的时候不需要,如jdbc驱动包,测试和运行的时候需要访问,但编译的时候是基于javax.sql包下的标准接口编译
-
optional
true 依赖不向上传递,默认是传递不用设置,详见下边说明
-
依赖传递和依赖调解
-
maven依赖的传递性
自动递归解析并下载每个包及其依赖包的依赖,不管依赖有多少层级
-
依赖范围对于依赖传递的影响
下面的表格详细列出了影响,第一列是一级依赖,第一行是二级依赖,依赖范围对依赖传递产生影响
compile test provided runtime compile compile runtime test test test provided provided provided provided runtime runtime runtime -
依赖调解
-
产生原因
由于循环依赖,自动下载依赖包,可能导致下载到同一个包的不同版本,可能会产生冲突
-
maven解决依赖冲突的机制——依赖调解
-
短路径优先原则
如:A-B-C-X1.0和A-D-X2.0,此时判断A-D-X2.0路径段,使用X2.0
-
申明优先选择
如:A-B-X1.0,A-D-X2.0,此时从pom中<dependency>标签判断谁配置靠前使用谁的依赖
-
-
-
可选依赖(补充)
补充说明dependency标签的optional属性,一般不用设置,如果特殊情况下需要阻止依赖传递,则可手动设置为true,这个也使用的比较少
-
依赖冲突解决
-
产生原因
由于依赖传递+依赖调解导致有时候可能会依赖到不正确的版本(一般是低版本的包)
-
解决办法
使用mvn depedency:tree命令查看项目依赖树,也可以使用IDE工具查看版本依赖
找到包问题的包依赖的jar版本,查找正常情况下应该依赖的版本
-
手动排除掉当前依赖的低版本包,此时会自动依赖高版本包
注意需要在依赖低版本的jar包里排除掉
如:A-D1.0、B-C-D2.0此时需要在A包里排除,具体的排除语法如下
<dependency> <groupId>A</groupId> <artifactId>A</artifactId> <version>1.0</version> <exclusions> <exclusion> <groupId>D</groupId> <artifactId>D</artifactId> </exclusion> </exclusions> </dependency>
-
三、理解maven的各级仓库及配置
1、本地仓库
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- localRepository | The path to the local repository maven will use to
store artifacts. | | Default: ${user.home}/.m2/repository -->
<localRepository>C:\Users\renpb\.m2\repository</localRepository>
在maven自己的settings.xml文件中指定,windows系统中一般配置在用户目录.m2\repository
2、内网私服
公司内部使用nexus搭建的一套服务,便于集中下载和管理jar包以及将自己开发的共用jar发布到私服供其他团队使用,管理内网私服下面单独做更详细的讲解
3、中央仓库
maven的jar包里自带一个超级pom,里面默认配置了一个中央仓库,如果不做任何设置,拉取依赖包时就会从该超级pom配置的中央仓库去下载
<repositories>
<repository>
<id>central</id>
<name>Maven Repository Switchboard</name>
<url>http://repo1.maven.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
4、其他仓库
某些厂商的jar并没有在maven中央仓库提供,此时需要从厂商自己提供的地址去下载,需要注意
5、镜像仓库
由于maven中央仓库服务器在国外,有时候下载依赖会非常慢,国内部分大厂提供镜像仓库,里边存放与中央仓库一模一样的资源,代理中央仓库,满足国内用户快速下载需求,一般都使用阿里云镜像仓库
一般配置在settings.xml里,配置如下,注意如果有内网私服可能会将镜像仓库直接配置在私服里,本地统一走私服即可
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>