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