一、Maven简介

1.概述

        Maven是专门用于依赖管理和构建Java项目的工具,将一个项目抽象成一个对象(POM)。
【tips】POM:Project Object Module,项目对象模型。

2.主要功能

(1)提供了一套标准化的项目结构,所有IDE使用Maven构建的项目结构完全一样,这样所有IDE创建的Maven项目可以通用;

(2)提供了一套标准化的构建流程(编译、测试、打包、发布...);

(3)提供了一套依赖管理机制(管理项目所用的第三方资源,如jar包、插件等),避免资源间的版本冲突问题,Maven使用标准的坐标配置来管理各种依赖。    

3.Maven模型


(1)插件(Plugin):Maven 生命周期的每一个阶段的具体实现都是由插件实现的。
(2)项目对象模型(Project Object Module,POM):通过pom.xml配置文件中的配置信息来描述当前通过Maven创建的这个项目
(3)依赖管理模型(Dependency):与项目对象模型一起,实现了依赖管理机制。
【tips】双箭头:项目依赖的资源通过依赖管理来获得,同时该项目也可以作为一个资源,通过依赖管理被别人使用。

(4)仓库:项目中依赖的第三方库所在的位置叫做仓库。Maven有三种类型的仓库:
        1)本地仓库(Local Repository):存储了当前计算机上的jar包;
        2)远程仓库(Remote Repository):又叫私服,开发人员自己的定制仓库,包含了所需要的代码库或者其他工程中用到的 jar 文件;
        3)中央仓库(Central Repository):由 Maven 社区提供的仓库,其中包含了大量常用的库。

二、Maven的基本使用

1.常用命令

(1)compile:编译,生成target文件
(2)clean:清除。
(3)test:测试,执行测试代码。
(4)package:打包,将项目打包成jar包。
(5)install:安装,将jar包下载到本地仓库。

2.生命周期

        Maven 构建生命周期描述了一个项目构建和发布的过程。Maven 有以下三个标准生命周期
(1)clean:项目清理的处理
(2)default:核心工作,如编译、测试、打包、安装等;
(3)site:项目站点文档创建的处理,产生报告、发布站点等。
【tips】在同一个生命周期内,执行后面的命令,这前面的命令会自动执行。比如执行install,compile、test、package会自动执行,但是clean不会自动执行,因为它是另一个生命周期了。

3.Maven坐标

        Maven中的坐标是资源的唯一标识,使用坐标来定义项目或引入项目需要的依赖。
(1)坐标构成:
        1)groupId:定义当前Maven项目隶属组织名称(通常是域名反写);
        2)artifactId:定义当前Maven项目名称(通常是模块名称);
        3)version:定义当前项目版本号
(2)依赖范围:通过设置坐标的依赖范围(scope),可以设置对应jar包的作用范围:
        1)主程序范围有效(main文件夹范围内);
        2)测试程序范围有效(test文件夹范围内);
        3)是否参与打包(package指令范围内)。
        
        六种依赖范围:
依赖范围 编译环境 测试环境 运行环境 例子
compile(默认)

logback
test


Junit
provided


servlet-api
runtime


jdbc驱动
system


储存在本地的jar包
import 引入DependencyManagement
(3)依赖范围的传递性
        带有依赖范围的资源在传递时,作用范围将受影响。


三、分模块开发的思想

1.分模块开发的意义

        将原始模块按功能拆分成若干子模块,方便模块间的相互调用和接口共享。
        

2.分模块开发

(1)书写模块代码

        分模块开发需要针对不同功能开发不同的模块,而不是将工程开发完毕再拆分。

(2)★通过Maven的install指令将模块安装到本地仓库

(3)导入子模块依赖

        
【注意】要引用子模块A,要先将子模块A安装(install)到本地仓库!!!


四、依赖管理

1.依赖传递

        依赖具有传递性。
(1)直接依赖:在当前项目中通过坐标直接配置的依赖;
(2)间接依赖:若当前项目依赖的资源A依赖了资源B,则当前项目也会间接依赖资源B。

2.依赖传递中的冲突问题

(1)路径优先:依赖中的相同资源,层级越深的优先级越低(被覆盖);
(2)声明优先:当相同资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的;
(3)特殊优先:同级配置了多个相同的资源时,后配置的覆盖之前配置的。

3.可选依赖

        如果项目A依赖的资源B不想被将来依赖项目A的项目看到该如何处理?
        可选依赖指对外隐藏当前项目所依赖的资源(不透明)。
        

4.排除依赖

        现project02依赖了project03,如果project02不想使用project03传递过来的间接依赖log4j,该如何处理?
        在project02中使用排除依赖,主动断开不需要的依赖。
【注意】被排除的依赖不需要指定版本!
        
【tips】可选依赖与排除依赖的区别?
        如果我用的依赖不想让别人看到,就用可选依赖;如果我不想用依赖传递过来的依赖,就用排除依赖。

五、聚合

1.聚合的相关概念

(1)聚合
        将多个模块组织成一个整体,对这些模块同时进行项目构建的过程称为聚合。
(2)聚合工程
        通常是一个不具有业务功能的有且只有一个pom文件的“空”工程。

2.聚合工程

(1)创建Maven工程
(2)设置打包类型为pom
        
(3)设置要管理的子模块<module>
        使用路径搜索模块:
        

六、继承

1.什么是继承?

        继承描述的是两个工程间的关系,与java中的继承相似,子工程可以继承父工程中的配置信息,常用于依赖关系的继承。

2.继承的作用?

(1)子工程可以使用父工程中配置的依赖;
(2)减少依赖的版本冲突;
(3)简化配置。

3.工程继承的实现

(1)在父工程的pom文件中配置依赖关系
        <packaging>pom</packaging>
        1)可被
                
        2)可选依赖
                用资源管理标签<dependencyManagement>配置的依赖。
                
【tips】①对于可选依赖,若子工程需要,就在自己pom中配,不需要就不配;
             ②子工程配置可选依赖时,不需要提供版本<version>,版本由父工程统一提供,这样就避免了版本冲突。
(2)在子工程的pom文件中配置父工程的信息
        
【tips】子工程也可以用父工程没有的依赖。

七、属性(properties )

        可以自定义属性进行依赖的版本管理等。

1.定义属性

        

2.使用属性

        

3.资源文件加载pom中的属性

        将资源文件(如jdbc.properties)中的信息在pom文件中定义成属性。
(1)定义属性
        
(2)配置资源文件目录,开启使用权限
        
【tips】配置目录时只能配置一个<directory>标签,若想将项目下的所有resources包都配置上,要这样做:
        
(3)在资源文件中使用属性
        

4.打war包时无web.xml报错怎么解决?

        

八、多环境开发配置与应用

1.什么是多环境开发?

        Maven项目是在开发环境(自己的计算机)上开发的,测试时可能会在专门的测试环境中进行测试,而上线以后又会在专门的生产环境中运行,这就叫做多环境开发。在不同的环境中,maven项目中配置的内容不同,因此,maven提供了配置多种环境的设定,可以在使用过程中快速切换环境。

2.配置多环境

(1)配置三种环境

        

(2)★环境快捷切换

        

3.跳过测试

(1)法一:

        

(2)法二:跳过测试指令

        

(3)法三:细粒度控制跳过测试