【maven】maven基础篇 - 学习笔记

【目录结构】

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?】


-Mavenmeɪvn], a Yiddish word meaning “accumulator of knowledge”.

(在美国是一个口语化的词语,表示“专家、内行”的意思。)

-Maven是一个项目管理工具,它包含了一个项目对象模型(POMProject Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)插件目标(plugin goal)的逻辑。

结合实际开发中遇到的一些问题先看看Maven能帮我们做什么。

1、程序开发中需要引用各种jar包,每用到一种jar包,都需要手动引入工程目录,较大的工程引用的jar包甚至有几十个乃至上百个,而且经常遇到各种让人抓狂的jar包冲突,版本冲突。

2、程序员开发写的都是Java文件,只认二进制字节码的计算机是读不懂的,必须对java文件进行编译生成.class文件,计算机才能读懂。现在这项工作已经可以由各种集成开发工具帮助我们完成,如EclipseIntelliJ 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是一个项目管理工具,它包含了一个项目对象模型(POMProject 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包版本冲突解决的四种方式

https://blog.csdn.net/coralime/article/details/104863126

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值