GitHub开源项目与基础架构学习 Maven

个人学习GitHub开源项目与基础架构系列 Maven篇


Maven简介

Maven (翻译为"专家","内行"),是一个很好的跨平台的项目构建依赖管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理

Why Maven(优点)

① 一个项目就是一个工程

  如果项目非常庞大,就不适合使用package来划分模块,最好是每一个模块对应一个工程,利于分工协作。

  借助于maven就可以将一个项目拆分成多个工程

② 项目中使用jar包,不需要再“复制”、“粘贴”项目的lib中

  同样的jar包重复的出现在不同的项目工程中,你需要做不停的复制粘贴的重复工作。

  借助于maven,可以将jar包保存在“仓库”中,不管在哪个项目只要使用引用即可就行

③ jar包需要的时候,不需要每次都要自己准备好或到官网下载

  借助于maven我们可以使用统一的规范方式下载jar包,规范

④ jar包版本不一致的风险

  不同的项目在使用jar包的时候,有可能会导致各个项目的jar包版本不一致,导致未执行错误

  借助于maven,所有的jar包都放在“仓库”中,所有的项目都使用仓库的一份jar包。

⑤ 一个jar包依赖其他的jar包,不需要自己手动的加入到项目中

  FileUpload组件->IO组件,commons-fileupload-1.3.jar依赖于commons-io-2.0.1.jar

  极大的浪费了我们导入包的时间成本,也极大的增加了学习成本

  借助于maven,它会自动的将依赖的jar包导入进来

What Maven

①maven是一款服务于java平台的自动化构建工具

make->Ant(最早的构建工具)->Maven(支持网络库下载)->Gradle(承了Ant的灵活和Maven的生命周期管理,Groovy文件)

② 构建

构建定义:把动态的Web工程经过编译得到的编译结果部署到服务器上的整个过程。

  √ 编译:java源文件[.java]->编译->Classz字节码文件[.class]

  √ 部署:最终在sevlet容器中部署的不是动态web工程,而是编译后的文件

 

③ 构建的各个环节

       [1] 清理clean:将以前编译得到的旧文件class字节码文件删除

  [2] 编译compile:将java源程序编译成class字节码文件

  [3] 测试test自动测试,自动调用junit程序

  [4] 报告report:测试程序执行的结果

  [5] 打包package动态Web工程打War包,java工程打jar包

  [6] 安装install:Maven特定的概念-----将打包得到的文件复制到“仓库”中的指定位置

  [7] 部署deploy:将动态Web工程生成的war包复制到Servlet容器下,使其可以运行


项目构建

Maven实现了“构建”标准化,简单化,自动化。Maven抽象了一个完整的构建生命周期模型,吸取了大量其它构建脚本和构建工具的优点,总结了大量项目的实际需求。形成一个约定,标准,模型。项目构建过程包括【清理项目】→【编译项目】→【测试项目】→【生成测试报告】→【打包项目】→【部署项目】这几个步骤,这六个步骤就是一个项目的完整构建过程。


依赖管理

Maven引进一个基础概念,坐标系统。让世界上的每一个JAR包都有一个独一无二的坐标。依赖指的是jar包之间的相互依赖,比如我们搭建一个SpringBoot的开发框架时,光光有spring-boot-starter.XXX.jar这个jar包是不行的,spring-boot-starter.XXX.jar还依赖其它的jar包,依赖管理指的就是使用Maven来管理项目中使用到的jar包,Maven管理的方式就是“自动下载项目所需要的jar包,统一管理jar包之间的依赖关系”。

Maven坐标组成

  • groupId:组织标识(包名)
  • artifactId:项目名称
  • version:项目的当前版本
  • packaging:项目的打包方式,最为常见的jar和war两种

依赖范围

依赖范围scope用来控制依赖和编译,测试,运行的classpath的关系

1.compile 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
2.test:测试依赖范围。只对于测试classpath有效
3.provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
4.runtime:运行时提供。例如:jdbc驱动

传递性依赖

假如有Maven项目A,项目B依赖A,项目C依赖B。那么我们可以说 C依赖A。也就是说,依赖的关系为:C—>B—>A。那么我们执行项目C时,会自动把B、A都下载导入到C项目的jar包文件夹中,这就是依赖的传递性

一个项目A,通过不同依赖传递路径依赖于X,若在不同路径下传递过来的X版本不同,那么A应该导入哪个版本的X包呢?

依赖调节策略

第一原则:路径近者优先原则

第二原则:第一声明者优先原则

eg.1 X是A的传递性依赖 路径近者优先

A->B->C->D->X(1.6)
A->D->X(2.0)
根据第一原则:2.0会引入进来

eg.2 X是A的传递性依赖 第一声明者优先

A->D->X(2.0) 先声明的引入
A->D->X(3.0)


约定优于配置(Convertion Over Configuration)的思想

按约定编程,是一种软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。开发人员仅需规定应用中不符约定的部分,Maven约定的项目结构如下图,只需配置很少的信息,Maven就可以自动完成编译、测试和打包等工作。


Maven原理探究

maven项目三大生命周期

默认构建生命周期(Default Lifeclyle): 该生命周期表示这项目的构建过程,定义了一个项目的构建要经过的不同的阶段。

清理生命周期(Clean Lifecycle): 该生命周期负责清理项目中的多余信息,保持项目资源和代码的整洁性。一般拿来清空directory(即一般的target)目录下的文件。

站点管理生命周期(Site Lifecycle) :向我们创建一个项目时,我们有时候需要提供一个站点,来介绍这个项目的信息,如项目介绍,项目进度状态、项目组成成员,版本控制信息,项目javadoc索引信息等等。站点管理生命周期定义了站点管理过程的各个阶段。
 

maven根据一个项目的生命周期的每个阶段,将一个项目的默认生命周期抽象成了如上图所示的23个阶段

 

 

maven指令与生命周期阶段的关系

mvn compile  //让当前项目经历生命周期中的1-->7 阶段 :完成编译主源代码编译
mvn package  //让当前项目经历生命周期中的1-->17阶段 :完成打包
mvn install  //让当前项目经历生命周期中的1-->22阶段 :完成包安装到本地仓库
mvn deploy   //让当前生命经历生命周期中的1-->23阶段 :完成包部署到中心库中

 

参考链接 https://blog.csdn.net/luanlouis/article/details/50492163

                https://www.cnblogs.com/hzg110/p/6936101.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值