Maven
生命周期
Maven的生命周期是对所有的构建过程进行抽象和统一。
Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,生命周期只是定义了一系列的阶段,并确定这些阶段的执行顺序。而在执行这些阶段时,实际的工作还是由插件来完成的。这种思想与设计模式中的模板方法非常相似。
Maven有三套相互独立的生命周期:
- Clean:clean生命周期的目的是清理项目
- Default:default生命周期的目的是构建项目
- site:site生命周期的目的是建立项目站点。
完整生命周期:
用户在mvn命令后可以指定三个生命周期中的任何阶段,则Maven会按以下逻辑执行:首先会得到该阶段所属生命周期,从该生命周期中的第一个阶段开始按顺序执行,直至该阶段本身。例如执行mvn clean命令会依次执行clean生命周期中的pre-clean阶段及clean阶段。mvn命令后可以指定多个阶段,Maven会按照输入的顺序依次执行,每次执行都会按照之前描述的逻辑执行。
之前提到实际的工作还是由插件来完成的,这意味着插件需要和阶段绑定起来。Maven已经事先将很多核心插件绑定到对应的阶段,这样用户几乎不用配置就有构建Maven项目。
依赖传递和可选依赖
应用场景:
第一直接依赖: HelloFriend项目依赖Hello项目
第二直接依赖: MakeFriend项目依赖HelloFriend项目
如图所示 MakeFriend 项目只依赖了 HelloFriend,但是也把Hello依赖进来了
依赖范围对传递依赖的影响
传递依赖是会受到依赖范围的影响的,具体来看结果如下:
依赖阻断
例如我们在HelloFriend项目里面的Hello依赖处添加该配置 <optional>true</optional>
表示 HelloFriend 被其他项目依赖时,不传递 Hello 的依赖至依赖于 HelloFriend 的项目
可选依赖
如果我们需要在依赖中明确的排除掉某一依赖,则可以使用exclusion属性,排除掉引用的依赖
Maven继承和聚合
继承的意义
继承就是避免重复,maven的继承也是这样,它还有一个好处就是让项目更加安全。比如我们在项目开发的过程中,可能多个模块独立开发,但是多个模块可能依赖相同的公共模块,比如说每个模块都需要javaseo-utils,在编译的时候,maven-compiler-plugin插件也要被引入,maven仓库地址以及发布目录都是相同的配置。我们可以使用Maven的继承功能,把公共的配置信息写到父模块中,子模块只要继承了该父模块,也会继承父模块的配置信息。
可继承的POM元素
groupId :项目组 ID ,项目坐标的核心元素;
version :项目版本,项目坐标的核心元素;
description :项目的描述信息;
organization :项目的组织信息;
inceptionYear :项目的创始年份;
url :项目的 url 地址
develoers :项目的开发者信息;
contributors :项目的贡献者信息;
distributionManagerment :项目的部署信息;
issueManagement :缺陷跟踪系统信息;
ciManagement :项目的持续继承信息;
scm :项目的版本控制信息;
mailingListserv :项目的邮件列表信息;
properties :自定义的 Maven 属性;
dependencies :项目的依赖配置;
dependencyManagement :醒目的依赖管理配置;
repositories :项目的仓库配置;
build :包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等;
reporting :包括项目的报告输出目录配置、报告插件配置等。
父工程是MavenJava项目,只作依赖管理,src文件夹可以删掉,打包方式是 pom 包
创建子工程 hami_core,是 MavenJava 项目
创建子工程 hami_console,是 MavenJavaWeb 项目
出现 BUILD SUCCESS 即创建成功,添加 java 和 resources 文件夹,将其分别变为源码文件夹和资源文件夹,以及修改 web.xml 配置文件,如图:
按此模板创建 hami_portal 和 hami_file 子工程,父工程的pom文件如图:
继承的依赖管理
父类直接引用依赖,如果在父类的dependencies内直接引用依赖,则子类都会继承该依赖
父类通过dependencyManagement管理依赖,子类不会默认继承该依赖,但是当子类使用该依赖时无需考虑版本信息,直接继承父类dependencyManagement中设置的版本号(Version)
聚合管理
我们在平时的开发中,项目往往会被划分为好几个模块,比如common公共模块、system系统模块、log日志模块、reports统计模块、monitor监控模块等等。这时我们肯定会出现这么一个需要,我们需要一次构件多个模块,而不用每个模块都去mvn;
以上面得父子项目为例,当我们对parent进行mvn install时,会对所有子项目均进行install操作
通过 properties元素用户可以定义一个或多个 maven 属性,然后在 maven 的其他地方使用 ${属性名称} 的方式引用该属性,这种做法的意义在于消除重复和统一管理。比如,需要在多个地方重复声明同样的 junit 版本,现在只需要在一个地方声明就可以。