准备资源:jdk1.8、apache-maven-3.6.3、idea2019.3.3
一、Maven概述- 什么是Maven?
Maven是一款自动化构建工具,服务于Java平台的项目构建和依赖管理。 - 特点
(1) 方便添加第三方jar包
添加jar包的传统方式是将需要的jar包拷贝复制到项目下的lib目录中,这样做会让项目占用空间变的很大。Maven使用pom文件来维护项目需要使用的jar包,程序会根据pom中维护的依赖坐标自动从本地仓库加载并使用jar包。
(2) 方便获取第三方jar包
传统方式需要我们自己在上网查找jar包资源,下载到本地,然后添加到项目中。Maven中,我们只要将需要的jar包坐标写入pom文件中,Maven就会自动到外网的中心仓库中将jar包下载到本地仓库中。
(3) 自动处理jar包之间的依赖关系
当一个jar包依赖其他的jar包时,Maven会自动将所依赖的jar包从本地仓库导入,如果本地仓库不存在,就会从外网的中央仓库将依赖下载到本地,然后导入项目。
(4) 自动处理jar包之间的冲突关系
当两个或者更多个jar包都依赖同一种jar包,但是所依赖的jar包版本号不同的时候,Maven会自动去解决这种冲突关系。处理原则是:最短路径者优先和先声明者优先。
(5) 能够将一个项目拆分成多个模块
(6) 实现项目的分布式部署
-
安装配置Java:
(1)使用引导程序安装java1.8,记录安装目录
(2) 配置系统环境变量JAVA_HOME、PATH系统环境变量名 取值 例子 JAVA_HOME java安装目录 C:Program FilesJavajdk1.8.0_311 PATH 末尾添加:%JAVA_HOME%/bin %JAVA_HOME%/bin
-
安装配置Maven
(1) 解压Maven压缩包,记录解压位置
(2) 配置系统环境变量MAVEN_HOME、PATH系统环境变量名 取值 例子 MAVEN_HOME Maven解压位置根目录 D:moudleapache-maven-3.6.3 PATH 末尾添加:%MAVEN_HOME%/bin %MAVEN_HOME%/bin
(3) 配置本地仓库地址和外网中央仓库地址
用文本编辑器打开%MAVEN_HOME%/conf/settings.xml,在settings标签内第一行添加D:moudleapache-maven-3.6.3repository 找到mirrors标签,在标签内部添加
alimaven aliyun https://maven.aliyun.com/repository/central central -
验证安装是否成功
(1) 打开cmd窗口
(2) cmd窗口中输入:mvn -v
cmd打印上述输出,表示Java和Maven都安装成功。 -
与Idea集成
(1)打开idea
(2)Configure --> Settings
(3)Build,Execution,Deployment --> Build Tools --> Maven
(4)设置Maven home directory、User settings file、Local repository配置项名 解释 Maven home directory MAVEN_HOME User settings file %MAVEN_HOME%/conf/settings.xml Local repository 本地仓库位置
-
pom.xml文件:Project Object Model:项目对象模型。将Java工程的相关信息封装为对象作为便于操作和管理的模型。Maven工程的核心配置。
-
约定的目录结构,不能随意修改
-
坐标
(1)定义: jar包的唯一标识属性名 说明 例子 groupId 公司或者组织的域名倒序+项目名称 com.company.project-name artifactId 要引入的jar包所属项目的模块名称 moudle-name version 版本号 4.12
(2)如何通过坐标查找jar包?
将groupId、artifactId、version三个向量连起来,以连起来的字符串作为目录结构到仓库中寻找,例如:com.company.project-name moudle-name ==> com/company/project-name/moudle-name/4.12/moudle-name-4.12.jar4.12 -
依赖管理
(1) 概念:当A.jar需要使用B.jar中的类的时候,就说A依赖于B。
(2)依赖分类:
a. 直接依赖:A.jar直接使用C.jar中的类,此时A直接依赖于C;
b. 间接依赖:A.jar直接依赖于B.jar,B.jar直接依赖于C.jar,如果A.jar需要使用C.jar中的类时,此时就说A间接依赖于C;
(3)依赖范围:依赖范围 解释 compile(全部编译) main目录下的Java代码可以访问这个范围下的依赖,会将该范围下的依赖也一并打入jar包 test(只用于测试) 只有test目录下的Java代码可以访问这个范围下的依赖,不会将该范围下的依赖一并打入jar包 provided(已由服务器提供) main和test目录下的Java代码都可以访问这个范围下的依赖,不会将改范围下的依赖一并打入jar包,这些依赖应该由运行jar包的服务器提供
使用方式为:
com.company.project-name moudle-name 4.12 test (4)依赖的传递性
当间接依赖的jar包使用compile范围导入时,其他间接依赖该jar包的模块才能访问该jar包。例如:依赖关系 B引入C的依赖范围 C对A的可见性 compile 可见 A 依赖于 B 依赖于 C test 不可见 provided 不可见
(5)依赖原则 => 解决jar包冲突
a. 路径最短者优先
b. 先声明者优先
模块A的pom.xml文件中引入B和C的代码如果是:
... ... 那么依赖关系为:
模块A的pom.xml文件中引入B和C的代码如果是:... ... 那么依赖关系为:
(6)依赖的排除
当模块A依赖于B.jar(或者更多jar包)时,如果在A模块中不想引入B.jar(或者其他jar包)所依赖的其他jar包时,可以不引入B.jar(或者其他jar包)所依赖的其他jar包。
使用方式为:com.company.project-name B 1.0 compile com.company.project-name moudle-name ... ... ... ...com.company.project-name moudle-name 2.2 compile ... ... ... ...(7)在一个模块中,统一指定版本号
有一些jar包必须联合使用,是一整套的,每个jar包的版本号最好相同,不然会出兼容性问题。但是当某一套jar包数量太多时,修改版本号不方便,此时就可以统一指定版本号。
pom.xml文件中应如下配置:...
4.0.0.RELEASE ... ... ...org.springframework spring-webmvc ${spring-version} org.springframework spring-jdbc ${spring-version} org.springframework spring-orm ${spring-version} (8)仓库
a. 本地仓库:settings.xml中配置的存放jar包的本机文件路径;
b. 远程仓库:远程仓库类型 说明 私服 架设在当前局域网环境下,为当前局域网范围内的所有Maven工程服务,修改localRepository 中央仓库 架设在Internet上,为全世界所有Maven工程服务 中央仓库镜像 架设在各个大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的响应用户请求
(9)主要生命周期
完整的生命周期是:
clean=>validate=>compile=>test=>package=>verify=>install=>site=>deploy生命周期 作用 clean 清除 compile clean + 中间的生命周期 + 编译main下的Java文件 test clean + 中间的生命周期 + 编译test下的Java文件,并执行 package clean + 中间的生命周期 + 打包 install clean + 中间的生命周期 + 将打好的jar包放在本地仓库中,放在本地仓库之后,就可以在其他模块的pom文件中引入该jar包
(11)插件
Maven生命周期的作用是由插件提供的功能,每个插件可能提供多个功能,比如:
complier插件提供了三个功能。
- 什么是继承
父模块统一管理依赖的版本号,所有子模块引入同一种依赖后,都使用父模块中声明的依赖版本号。 - 为什么使用继承
有一些依赖的依赖范围不需要为compile,这些依赖一旦成为间接依赖,其他模块想要使用,就都需要单独配置,可以使用继承统一版本号,需要进行修改的时候,只需要修改父模块pom.xml文件中维护的版本号即可。 - 配置方式
(1)手动配置:
a. 项目结构为:
b. 在parent模块的pom.xml文件中进行配置:...
pom junit junit 4.12 test ... ... ... ...
c. 在子模块的pom.xml文件中进行配置:
child1模块的pom.xml文件配置(child2一样):
...com.company.project-name parent 1.0 ../parent/pom.xml junit junit ... ... ... ...
(2)Idea自动配置:
-
什么是聚合
父模块下有很多个子模块,可以将所有子模块的构建工作(执行各个生命周期)交给父模块统一处理。 -
配置方法
在父模块的pom.xml文件中配置:...
pom ...../child1 ./child2 ... ... ... ...



