1.为什么需要maven
- 解决jar包之间的冲突
- jar包之间的依赖关系
- 获取第三方jar包更方便
- 将项目拆分为多个工程模板
- 实现项目的分布式部署
2.自动化构建工具
清理→编译→测试→报告→打包→安装→部署
3.maven的核心概念
-
POM(项目对象模型)
-
约定的目录结构
-
坐标(groupId、artifactId、version)
-
依赖管理(dependency标签)
-
仓库管理
-
生命周期
4.修改本地仓库地址
打开apache-maven-3.6.3/conf下的setting.xml,修改localRepositosy标签设置本地仓库地址
5.约定的目录结构
6.坐标
groupId:公司或组织域名的倒序+当前项目名称
artifactId:当前项目的模块名称
version:版本
7.如何通过坐标到仓库中寻找jar包
-
将gav向量拼接起来,groupId/artifactId/version/artifactId-version.jar
-
以连起来的字符串作为目录结构到仓库中去查找
8.仓库
- 本地仓库
- 远程仓库(局域网内的私服、中央仓库、中央仓库的镜像)
9.仓库中的文件
-
maven中的插件
-
自己开发的项目模块
-
第三方的jar包
10.生命周期
- clean生命周期 pre-clean→clean→post-clean
- site生命周期 pre-site→site→post-site→site-deploy
- default生命周期 complie→test-compile→test→package→install
11.手动创建的maven工程导入到eclipse中
右键→Import→Maven→Existing Maven project
12.jar包依赖的范围
- compile
main和test目录下的代码都可以访问,会部署到服务器运行时要放在WEB-INF的lib目录下
- test
仅test目录下的代码可以访问,不会部署到服务器运行时要放在WEB-INF的lib目录下
例如:对junit的依赖,仅仅是测试程序需要
- provided
main和test目录下的代码都可以访问,不会部署到服务器运行时要放在WEB-INF的lib目录下
例如:servlet-api在服务器上运行时,servlet容器会提供相应的api,所以部署的时候不需要
13.依赖的传递性
Q:当存在间接依赖时,主工程对间接依赖的jar包可以访问吗?
A:只有间接依赖的jar包范围为compile,才可以访问
14.依赖原则
- 路径最短者优先
A依赖于B,B依赖于C,B与C依赖的jar包版本不同,这时A所依赖的jar包版本取决于B。
- 路径相同时先声明者有限
A依赖于B,A又依赖于C,B与C依赖的jar包版本不同,这时A所依赖的jar包版本取决于在依赖时B与C中先声明者。
15.exclusions可以排除间接依赖
16.继承
如果需要统一多个模块的jar包版本,则需创建父工程,在父工程中配置jar包的版本,在子工程中引用父工程。创建父工程时打包方式为pom,子工程的打包方式为jar。若子工程的gav与父工程一样,则可以删除。
父工程中的pom.xml文件
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.atguigu.maven</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <!-- 通过继承管理依赖 --> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.0</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> </project>
子工程中的pom.xml文件
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 设置父工程 --> <parent> <groupId>com.atguigu.maven</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 从当前工程出发查询父工程中pom.xml文件的 相对路径 --> <relativePath>../parent/pom.xml</relativePath> </parent> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies> <artifactId>son</artifactId> </project>
17.聚合
将多个工程拆分成模块后,需要手动逐个安装到仓库才能够生效,修改源代码后也需要逐个手动进行clean,而使用聚合可以批量进行maven工程的安装
<modules> <module>../Hello</module> <module>../HelloFriend</module> <module>../OurFriend</module> </modules>