【目录结构】
1. What is Maven?
2. Maven的依赖管理
3. Maven的一键构建
3.1 构建的概念
3.2 构建的几个重要环节
3.3 Maven的一键构建(或者叫自动构建)
4. Maven仓库的种类和彼此关系
5. Maven标准目录结构
6. Maven的生命周期
7. Maven的概念模型
写在最后的话
#1#->【What is Maven?】
-Maven [ˈmeɪvn], a Yiddish word meaning “accumulator of knowledge”.
(在美国是一个口语化的词语,表示“专家、内行”的意思。)
-Maven是一个项目管理工具,它包含了一个项目对象模型(POM:Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件目标(plugin goal)的逻辑。
结合实际开发中遇到的一些问题先看看Maven能帮我们做什么。
1、程序开发中需要引用各种jar包,每用到一种jar包,都需要手动引入工程目录,较大的工程引用的jar包甚至有几十个乃至上百个,而且经常遇到各种让人抓狂的jar包冲突,版本冲突。
2、程序员开发写的都是Java文件,只认二进制字节码的计算机是读不懂的,必须对java文件进行编译生成.class文件,计算机才能读懂。现在这项工作已经可以由各种集成开发工具帮助我们完成,如Eclipse、IntelliJ IDEA等都可以将代码即时编译。
3、bug无所不在,因此需要进行单元测试,一个一个运行来检验代码质量。
4、开发完成以后需要把代码与各种配置文件、资源整合到一起,定型打包,如果是web项目,还需要发布到服务器上。
第1个问题,程序开发中需要引用各种jar包,每用到一种jar包,都需要手动引入工程目录,这个过程是非常繁琐且烦人的。较大的工程引用的jar包甚至有几十个乃至上百个,引用的jar包多了,随之而来的就是各种jar包冲突、版本冲突等问题,而手动解决jar包冲突是非常复杂的,作为一个java开发人员,我们不希望天天被这种问题所困扰,所以这个项目如果现在交给Maven来管理,那么jar包冲突解决起来就非常简单了。这是Maven能为我们做的第一件事,解决jar包冲突。
第2个问题,程序员开发写的都是java文件,而只认二进制字节码的计算机是读不懂的,必须对java文件进行编译生成.class文件,计算机才能读懂。现在这项工作已经可以由各种集成开发工具帮助我们完成,如Eclipse、IDEA等都可以将代码即时编译。Maven也能帮我们完成代码的编译工作。这是Maven能为我们做的第二件事,编译代码。
第3个问题,写代码的人都知道bug是无所不在的,这世上并没有绝对完美的代码,为了减少bug,必须进行单元测试,保证代码质量。但随着代码越来越多,测试也越来越多,如果通过Maven管理,它能把指定目录下的单元测试全部一次性执行完成,并且生成报告告诉你哪些是正确的哪些是有异常的,这是Maven能为我们做的第三件事情,进行单元测试。
第4个问题,项目开发完成以后需要将各种配置文件、资源文件进行打包,如果是web项目,还需要将完成后的打包文件发布到服务器上。在传统的开发过程中,项目完成以后都需要自己手动打包,但现在如果用Maven来管理项目,仅仅需要一个命令就能搞定。这是Maven能为我们做的第四件事情。
小结:与传统的开发过程相比,Maven能帮助我们解决各种各样的问题。它能帮你构建工程,管理jar包,编译代码,还能帮你自动运行单元测试,打包,生成报告,甚至能帮你部署项目,生成Web站点等等。总而言之,这是一款非常强大的项目管理工具!
#2#->【Maven的依赖管理】
传统的Javaweb工程,所依赖的第三方jar包都会放在项目中,一般存放在lib文件夹下,比如我平时开发的项目主要就用到了这4个jar包。
而在基于Maven开发的工程中,所依赖的jar包并不在项目中,所有的jar包会存放在一个jar包仓库,当要使用jar包的时候,会通过一个jar包的坐标去jar包仓库中取用。
当仅考虑一个工程文件的时候,其实传统的Javaweb工程和基于Maven开发的工程,jar包所占用的空间大小并没什么区别,Maven只是把jar包放在了仓库中而已。但是实际情况中,当有多个工程文件重复使用jar包,传统工程就会造成大量重复jar包文件占用磁盘空间,造成浪费。如果是基于Maven开发的工程,实际项目中不存放jar包,仅仅通过jar包坐标去jar包仓库去取用,多个工程可以共享一个jar包仓库。Maven的这个管理过程完美践行了java代码开发的标准之一即代码可重用。
那么到底什么是依赖管理呢?依赖管理用一句话总结就是Maven工程对jar包的管理过程。传统Javaweb工程将jar包放在项目中,而Maven将实际的jar包放在仓库中,当项目编译或运行的时候,Maven工程会通过jar包的坐标去仓库中找到对应的jar包。
#3#->【Maven的一键构建】
3.1 构建的概念
构建并不等同于创建,要了解构建的含义我们需要由浅入深地从以下三个方面来看:
纯Java代码
Java是一门编译型语言,源文件(.java)需要编译成二进制的字节码文件(.class)才能够执行。所以编写任何的Java代码必须经过编译得到.class文件才能执行。
Web工程
当需要通过浏览器访问Java程序时就必须将包含Java程序的Web工程编译的结果放到服务器上指定目录下,并启动服务器才行,而这个放的过程叫“部署”。
实际项目
在实际项目中整合第三方框架,web工程中处理Java程序和jsp、图片等静态资源之外还包括第三方框架的jar包以及各种各样的配置文件。所有这些资源都必须按照正确的目录结构部署到服务器上,项目才能正常运行。
综上所述
构建就是以我们编写的Java代码、框架配置文件、其他资源文件和jsp页面、图片等静态资源作为“原材料”,去“生产”出一个可以运行的项目的过程。
3.2 构建的几个重要环节
构建一共涉及到7个重要环节,分别是清理、编译、测试、报告、打包、安装和部署。
3.3 Maven的一键构建(或者叫自动构建)
现在我们来梳理一下Emma一天中的工作内容
Emma收到QA小组邮件通报有bug存在,她开始经过编译、打包、部署、测试等步骤运行项目,分析具体的问题,然后修改代码,再通过编译、打包、部署、测试完成以后重新发布项目,最后回复QA小组邮件报告bug修复完毕。
从中我们发现,Emma的很大一部分时间花在了“编译、打包、部署、测试”这些程式化的工作上面,而真正需要由Emma本人智慧实现的分析问题和编码却只占了很少一部分。能否将这些程式化的工作交给机器自动完成呢?——当然可以!这就是自动化构建。
Maven又是如何实现自动化构建的呢?简单的说来就是它可以自动的从构建过程的起点一直执行到终点。即Maven已经完全接管了包含清理、编译、测试、运行、打包、安装、部署等过程,并自动地从构建过程的起点一直执行到终点,不需要人为干涉,完全实现自动化构建的过程。
#4#->【Maven仓库的种类和彼此关系】
我们都知道maven工程里没有jar包,jar包都放在仓库里。
当安装完maven后会指定一个本地仓库的默认地址,在maven安装目录conf文件夹下【settings.xml】有这样一句话:
Default: ${user.home}/.m2/repository
默认的本地仓库会创建在系统盘一般都是C盘下的 .m2/repository 这个文件夹,为了节省系统盘的空间,我们可以自己指定本地仓库的位置,如下所示,我将本地仓库的默认位置进行了修改。
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>E:\maven\MyLocalRepository</localRepository>
maven工程内没有放置jar包,放置的只是jar包的坐标,当启动一个maven工程,会通过本地的jar包坐标去本地仓库中寻找对应的jar包。
如果本地仓库中没有jar包,此时计算机又是联网状态,它会自己找到一个叫中央仓库的地方,直接自动下载jar包到本地仓库中,如果没有联网,会报错,因为找不着所需的jar包。
中央仓库放置了几乎所有的开源的jar包。一般这个中央仓库的地址都在国外,下载速度非常慢,因此一般会改成国内的镜像地址,下载速度会提高很多。例如,这里添加了阿里云提供的maven镜像地址,在【settings.xml】中 <mirrors> </mirrors>标签中添加如下地址即可。
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
在公司开发中,为了能在不联网的情况下也能正常完成开发任务,把公司内部开发所需的jar包统一放置在一个地方,构建一个新的仓库叫远程仓库,在公司中也经常被叫作私服。在公司开发的时候,只需要确保我们自己的电脑和远程仓库在同一个局域网内,就可以直接通过局域网从远程仓库直接下载jar包到本地仓库。
假如远程仓库没有我们所需的jar包,远程仓库会直接去中央仓库中下载,也可以通过本地仓库上传的方式获取jar包。即远程仓库中的jar包有一部分来源于中央仓库的下载,有一部分来源于本地仓库的上传。
小结:
仓库分三类——本地仓库、远程仓库(私服)、中央仓库。
->当启动一个maven工程,maven会通过pom.xml文件中jar包的坐标去本地仓库寻找对应的jar包。
->默认情况下,如果本地仓库没有对应的jar包,在联网情况下,maven会自动去中央仓库下载jar包到本地仓库。
->在公司中(通常不联网的情况下),如果本地仓库没有对应的jar包,maven会先从远程仓库(私服)下载jar包。如果远程仓库(私服)也没有,可以从中央仓库下载,也可以通过本地仓库上传。
#5#->【Maven标准目录结构】
一个工程一般包含以下四个方面,核心代码部分、配置文件部分、测试代码部分和测试配置文件,相对应的,maven在创建工程时也已经对应每个部分创建了相应的文件夹,如上图所示,这个目录结构是maven已经设置好的规范标准,不允许修改。其中src/main/webapp是创建web工程时才有的目录结构,如果是普通的java工程,就只包含了其他4个目录。
#6#->【Maven项目的生命周期】
maven对项目构建过程分为三套且相互独立的生命周期
- Clean Lifecycle (清理生命周期) 在进行真正的构建之前进行一些清理工作 clean
- Default Lifecycle (默认生命周期) 构建的核心部分,包括编译(compile)、测试(test)、打包(package)、安装(install)和发布(deploy)等
- Site Lifecycle (站点生命周期) 生成项目报告、站点,发布站点。
#7#->【Maven的概念模型】
-Maven是一个项目管理工具,它包含了一个项目对象模型(POM:Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件目标( plugin goal)的逻辑。
-> 项目对象模型(POM)
- 项目自身信息
- 项目运行所依赖的jar包信息
- 项目运行环境信息,如:jdk、tomcat信息
-> 依赖管理系统(Dependency Management System)
通过maven的依赖管理对项目所依赖的jar包进行统一管理。
每一个jar包都需要包含4个部分,即公司组织的名称、项目名、版本号以及指定作用域,作用域可以缺省不写。
<dependency>
<groupId>junit</groupId> --(公司组织的名称)
<artifactId>junit</artifactId> --(项目名)
<version>4.12</version> --(版本号)
<scope>test</scope> --(作用域)
</dependency>
-> 一个项目生命周期(Project Lifecycle)
使用maven完成项目的构建,项目构建包括:清理、编译、测试、部署等过程,maven将这些过程规范为一个生命周期,如下所示是生命周期的各个阶段。每一个构建项目的命令都对应了maven底层的一个插件。
-> 一组标准集合
maven将整个项目管理过程定义一组标准,比如:通过maven构建工程有标准的目录结构,有标准的生命周期阶段、依赖管理有标准的jar包坐标定义等等。
-> 插件目标(plugin goal)
maven管理项目生命周期过程都是基于底层插件完成的。
#->【写在最后的话】
Maven官方文档:https://maven.apache.org/
Maven Repository: https://mvnrepository.com/
学习资料来源:https://www.bilibili.com/video/av70969191?p=30
学习资料在评论区可以找到,如果需要也可以私信我。
一些运行demo中遇到的问题小结
【Maven】记第一次使用maven创建web工程遇到的坑
https://blog.csdn.net/coralime/article/details/104699219
【MySQL】最新版8.0.15遇到的一些坑
https://blog.csdn.net/coralime/article/details/104780867
【maven】idea中基于maven-webapp骨架创建的web.xml问题
https://blog.csdn.net/coralime/article/details/104847223
【maven】jar包版本冲突解决的四种方式