maven是一个项目管理工具
- 依赖管理:maven对项目中的jar包的管理过程,真正的jar包放置在仓库中,项目中只需要放置jar包的坐标。
- 一键构建:maven自身集成了Tomcat插件,可以对项目进行编译,测试,打包,安装,发布等操作。
仓库的种类:
- 本地仓库
- 远程仓库【私服】
- 中央仓库
仓库之间的关系:
- 启动maven工程时,maven工程通过pom.xml文件中jar包的坐标去本地仓库找对应的jar包,默认情况下,如果本地仓库没有,maven就会去中央仓库下载对应jar包到本地仓库,在公司中,如果本地没有,则会先从私服中下载jar包,私服没有再去中央仓库,也可以本地上传。
maven常用的命令:
- clean
- complie
- test
- package
- install
- deploy
maven的声明周期:
maven工程导入jar包的冲突:
概念 | 解释 |
---|
直接依赖 | 项目中直接导入的jar包,就是项目的直接依赖包 |
传递依赖 | 项目中没有导入的jar包,是通过项目依赖的jar包传递到项目中的jar包叫传递依赖包 |
- 问题 :导入A和B两个版本号不同,不同功能的jar包,这两个jar包共同依赖同一个jar包C,但是因为导入的A,Bjar包的版本不同,导致最终maven导入的jar包C的版本存在疑惑
- 解决方式:
- 优先声明原则:maven会根据pom.xml文件中的上下顺序,只导入最上面的A或B依赖的那个版本的jar包
- 路径近者优先原则:直接依赖路径比传递依赖路径近,那么最终进入的jar包会是路径近的直接依赖
- 直接排除法:通过在jar包坐标下面配置exclusion标签的方式,声明该jar包的依赖包但不写依赖包版本号,此时,依赖包的版本和该jar包的版本一样,但不会在maven中显示(打破优先声明原则)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</exclusion>
</exclusions>
</dependency>
maven工程锁定jar包:
- 问题 :已知:两个项目属于父子依赖关系,依赖别的项目拿到的jar包,都属于传递依赖包。A项目被B项目依赖,那么A项目中的所有jar包会传递到B项目中,B项目的jar包对B来说是直接依赖,直接依赖的jar包会把A项目传递过来的jar包覆盖掉。
- 解决方式:
- 锁定jar包:通过dependencyManagement标签锁住A项目中的jar包的坐标,这样B项目或者其他项目中即使有同名的jar包,也无法覆盖。(提示:锁定jar包,只是锁定了jar包的版本,并不会根据锁定的jar坐标导入jar包,所以,还需要手动将dependencyManagement里面的jar包坐标复制粘贴到新的dependencies中)
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
</dependencies>
maven工程统一管理jar包:
- 通过el表达式,对jar包的版本进行统一管理,当jar包的版本需要变更时,可以集中修改
<properties>
<spring.version>5.1.10</spring.version>
<junit.version>4.12</junit.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>