了解Maven是什么?

在这里插入图片描述

1.Maven简介

Maven翻译为“专家”,“内行”。Maven是Apache下的一个纯java开发的开源项目
Maven 是一个项目管理工具,可以对 Java 项目进行构建依赖管理。
Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。
Maven创始者希望能够更多的让Java开发人员的日常工作更加容易,帮助理解任何基于Java项目。

         开源、管理工具、构建、依赖,所以概括的讲Maven是一个开源的对项目进行构建、依赖管理的一个管理工具。为了更方便写项目而生的一个工具,而Maven工具的两大功能就是项目构建依赖管理。所谓的项目构建就是帮助我们去项目构建,依赖管理就是帮我们管理jar包。

2.什么是项目构建

         什么是项目构建?项目构建是一个项目从:源代码 --> 编译 --> 测试 --> 打包 --> 部署 --> 运行的过程。我们为什么要使用maven工具来管理项目构建呢,因为它强大,我们以传统项目构建Maven项目构建进行对比理解。

传统项目构建

以web项目为例,传统构建项目的过程如下步骤:

​ 1)在idea中创建一个java web工程
​ 2)在工程中编写源代码及配置文件等
​ 3)对源代码进行编译,java源文件编译成.class文件
​ 4)执行Junit单元测试
​ 5)将工程打成war包部署至tomcat运行

这就是传统的项目构建过程,需要我们每次去手动建构,Maven项目构建有何不同。

Maven项目构建

​ Maven将项目构建的过程进行标准化,每个阶段使用一个命令完成,下图展示了构建过程的一些阶段:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-42qHvTbo-1648445906174)(Maven简介.assets/image-20220328000157850.png)]

清理:删除以前的编译结果,为重新编译做好准备。
编译:将Java源程序编译为字节码文件。
测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
报告:在每一次测试后以标准的格式记录和展示测试结果。
打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web工程对应war包。
安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。
部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行

         这就是使用Maven进行项目构建的好处,Maven对项目构建的过程进行标准化,通过一个命令即可完成一步构建过程。标准化和一步构建两个优点改善了传统项目构建的复杂,通俗的讲就是使用Maven我可以更方便、更快的进行项目构建。

         而标准化又是特别的重要,所谓的标准化相当于一套规则、一种规范,对于全球使用Maven管理项目的程序员来说,更有利于协同开发,因为大家使用的是同一种规范,一看就知道你的源代码在哪里,类文件放在哪里。

项目的构建方式

         关于项目构建工具,Java世界中主要有三大构建工具:AntMavenGradle。Ant几乎销声匿迹、Maven已经很好了,但美中不足,而Gradle却弥补了Maven的一些缺点,发展则如日中天。

1、Ant

         Ant也是一个项目构建工具,但是Ant有一个很致命的缺陷,那就是没办法管理依赖。我们一个工程,要使用很多第三方工具,不同的工具,不同的版本。每次打包都要自己手动去把正确的版本拷到lib下面去,这样会造成大量的代码重复,不用说,这个工作既枯燥还特别容易出错。为了解决这个问题,Maven闪亮登场。
2、Maven
         Maven不仅是一个项目构建工具,更是一个项目管理工具。它在项目构建工程中,比Ant更全面,更灵活Maven在进行项目构建时,它对项目目录结构拥有约定,知道你的源代码在哪里,类文件应该放到哪里去。

         Maven最核心的改进就在于提出仓库这个概念。我可以把所有依赖的包,都放到仓库里去,在我的工程管理文件里,标明我需要什么什么包,什么什么版本。在构建的时候,maven就自动帮我把这些包打到我的包里来了。我们再也不用操心着自己去管理几十上百个jar文件了。
3、Gradle
         一个开源的自动化构建系统,建立在Apache AntMaven Apache概念的基础上,并引入了基于Groovy的特定领域语言(DSL),而不是使用Apache Maven宣布的项目配置XML形式。

         maven已经很好了,可以满足绝大多数工程的构建。那为什么我们还需要新的构建工具呢?第一,maven是使用xml进行配置的,语法不简洁。第二,最关键的,maven在约定优于配置这条路上走太远了。就是说,maven不鼓励你自己定义任务,它要求用户在maven的生命周期中使用插件的方式去工作。这有点像设计模式中的模板方法模式。说通俗一点,就是我使用maven的话,想灵活地定义自己的任务是不行的。基于这个原因,gradle做了很多改进。

         Gradle并不是另起炉灶,它充分地使用了maven的现有资源。继承了maven中仓库,坐标,依赖这些核心概念。文件的布局也和maven相同。但同时,它又继承了anttarget的概念,我们又可以重新定义自己的任务了。(Gradle中叫做task)

3. 什么是依赖管理

          什么是依赖? 一个java项目可能要使用一些第三方的jar包才可以运行,那么我们说这个java项目依赖了这些第三方的jar包。
例如大家前面学过的javaWeb中需要的连接数据库的jar包、数据源的jar包等等。
         什么是依赖管理? 就是对项目所有依赖的jar包进行规范化管理。
对比传统项目的依赖管理和Maven项目的依赖管理。

传统项目的依赖管理

         传统的项目工程要管理所依赖的jar包完全靠人工进行,程序员从网上下载jar包添加到项目工程中。
手动拷贝jar包添加到工程中的缺点:
​ 1、没有对jar包的版本统一管理,容易导致版本冲突
​ 2、从网上找jar包非常不方便,有些jar找不到。
​ 3、jar包添加到工程中导致工程过大

Maven项目的依赖管理

         Maven项目管理所依赖的jar包不需要手动向工程添加jar包,只需要在pom.xml(Maven工程的配置文件)添加jar包的坐标,自动从Maven仓库中下载jar包运行。
使用Maven依赖管理添加jar的好处:
​ 1、通过pom.xml文件对jar包的版本进行统一管理,可避免版本冲突。
​ 2、Maven团队维护了一个非常全的Maven仓库,里边包括了当前使用的jar包,Maven工程可以自动从
Maven仓库下载jar包,非常方便。

4.使用Maven的好处

         通过上边介绍传统项目和Maven项目在项目构建及依赖管理方面的区别,Maven有如下的好处:
1、一步构建
Maven对项目构建的过程进行标准化,通过一个命令即可完成构建过程。
2、依赖管理
Maven工程不用手动导jar包,通过在pom.xml中定义坐标从Maven仓库自动下载,方便且不易出错。
3、Maven的跨平台,可在window、linux上使用。
4、Maven遵循规范开发,有利于提高大型团队的开发效率,降低项目的维护成本,公司都会考虑使用Maven来构建项目。

5.Maven的核心概念

         Maven包括Maven的目录结构Maven的仓库Maven的核心文件pom.xmlMaven的坐标Maven的生命周期5个核心概念。通过它们逐个去了解Maven的本质。

① Maven的目录结构

Maven默认约定了一套目录结构,在通过Maven创建了项目以后,项目的目录结构就是以这套目录结构作为模板创建的。虽然Maven提供了很多的模板,但是基本的目录结构都是固定的。

Maven约定的目录结构:
myFirstMavenProject
    |-- src
    |-- |-- main
    |-- |-- |-- java —— 项目的源代码所在的目录
                    com.kkb.entity
                    com.kkb.dao
    |-- |-- |-- resources —— 项目的资源文件所在的目录
    |-- |-- |-- webapp —— 如果是web项目,则该目录是web应用源代码所在的目录
    |-- |-- |-- |--WEB-INF
    |-- |-- |-- |-- |-- web.xml
    |-- |-- test
    |-- |-- |-- java ——测试代码所在的目录,如JUnit测试类
   					 com.kkb.dao.test
    |-- |-- |-- resources ——测试相关的资源文件所在的目录
    |-- target —— 项目构建的输出文件,如.class、.jar、.war文件(不需要创建,会自动
    生成)
    |-- pom.xml ——Maven项目核心配置文件,项目的描述文件

src、target和pom.xml同级,main和test同级,java、resource和webapp同级,基本的目录结构是固定的。

②Maven的仓库

maven的仓库可以分为本地仓库远程仓库


本地仓库

         本地仓库相当于一个缓存,在电脑上是一个文件夹,我们可以设置这个文件夹的路径(具体怎么设置会 在下面的配置体现),工程第一次需要某种jar包时,会联网从远程仓库下载并保存到本地仓库中 (在程序员的电脑上),当第二次使用时,不需要去远程仓库下载,会先去本地仓库中找,如果找不到 才会去远程仓库上下载。

         默认情况下,每个用户在自己的C盘用户目录下都有一个路径名为 .m2/respository/ 的仓库目录。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wtPeHB7H-1648445906176)(Maven简介.assets/image-20220328112438349.png)]

远程仓库

远程仓库中分为中央仓库私服两类。

中央仓库

​ 中央仓库中的jar包由专业团队(Maven团队)维护,中央仓库中存放了全世界大多数流行的开源软件的
jar包,是Maven默认的远程仓库。
​ 要浏览中央仓库的内容,Maven 社区提供了一个 URL:http://search.Maven.org/#browse。使用这个
仓库,开发人员可以搜索所有可以获取的代码库。

私服

         私服是另一种特殊的远程仓库,为了节省带宽和时间,应该在局域网内架设一个私有的仓库服务器,用 其代理所有外部的远程仓库。内部的项目还能部署到私服上供其他项目使用。除了中央仓库和私服,还 有很多其他公开的远程仓库,常见的有java.net Maven库(http://download.java.net/maven/2/)和jboss Maven库(http://repository.jboss.com/maven2/)等

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ReLpckIg-1648445906177)(Maven简介.assets/image-20220328111626127.png)]

         本质上都是联网从远程仓库或中央仓库去下载lib包到本地仓库,但其主要的仓库服务器地理位置不同导致反应速度和下载速度不同。

配置本地仓库

setting.xml文件中

PS:自己先新建一个文件夹作为本地仓库,路径不要有中文和非法字符。

<!-- 配置本地仓库 -->
<localRepository>D:\repository</localRepository>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R5yWZ45n-1648445906178)(Maven简介.assets/image-20220328112231772.png)]

         为什么要建议自己配置本地仓库的位置,就是因为默认是在C盘用户下.m2/repository下,仓库尽量不要放在C盘下。

配置远程仓库镜像

         Maven默认的远程仓库是Maven团队维护的中央仓库,由于网络原因,去中央仓库下载jar包需要到国外 的网站,不太便捷,速度慢,于是我们可以选择把国内的阿里云的Maven仓库作为中央仓库镜像。 修改 Maven 根目录下的 conf 文件夹中的 settings.xml 文件,在 mirrors 节点上,添加内容如下:

<!-- 配置阿里云镜像 -->
        <mirror>
            <id>nexus-aliyun</id>
            <name>Nexus aliyun</name>
            <url>http://Maven.aliyun.com/nexus/content/groups/public/</url>
            <mirrorOf>*</mirrorOf>
        </mirror>
        
<!-- 其中各个标签的含义是:
        id:当前镜像的唯一标识
        mirrorOf:将哪个远程仓库当做中央仓库镜像,中央仓库的id是central,所以将阿里云的Maven仓库
        设置为中央仓库镜像时,其值必须设置为central
        name:为当前的中央仓库镜像起一个名字,便于开发者阅读
        url:阿里云Maven仓库的地址
-->

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-px2saBlY-1648445906179)(Maven简介.assets/image-20220328112834331.png)]

         为什么叫镜像,那中央仓库有的他阿里云也有,这就叫镜像,镜像可以设置多个,当Maven项目需要某个包时,首先从本地仓库去找,如果没有找到时再去配置的镜像地址去找包,第一个镜像也没有时就去下一个镜像找,当所有镜像都没有才去默认的中央仓库找包,当然中央仓库是一定有的,它是由专业团队(Maven团队)维护。没有配置镜像时就默认走中央仓库路线。

③Maven的核心文件pom.xml

         POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。
         执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。

<project xmlns="http://Maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Maven.apache.org/POM/4.0.0
http://Maven.apache.org/xsd/Maven-4.0.0.xsd">
    <!-- Maven模型的版本 -->
    <modelVersion>4.0.0</modelVersion>
    <!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如
    com.companyname.project-group,Maven会将该项目打成的jar包放本地路
    径:/com/companyname/project-group -->
        <groupId>com.kkb.Maven</groupId>
        <!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
        <artifactId>HelloWorld</artifactId>
        <!-- 当前项目版本号:同一个项目开发过程中可以发布多个版本,此处标示0.0.1-->
        <!-- 当前项目版本号:每个工程发布后可以发布多个版本,依赖时调取不同的版本,使用不同的版本号
        当前项目版本号,snapshot为快照版本即非正式版本,release为正式发布版本
        -->
        <version>0.0.1-snapshot</version>
        <!--打包类型,一般有jar、war、pom等-->
        <packaging>jar</packaging>
        <!-- 名称:可省略 ,常用于 Maven 生成的文档。-->
        <name>Hello</name>
        <!--项目描述:可省略,常用于 Maven 生成的文档-->
        <description > </description>
        <!-- 项目依赖构件配置,配置项目依赖构件的坐标 -->
    <dependencies>
        <!-- 依赖设置 ,可以有多个dependency节点-->
        <dependency>
            <!-- 依赖组织名称 -->
            <groupId>junit</groupId>
            <!-- 依赖项目名称 -->
            <artifactId>junit</artifactId>
            <!-- 依赖版本名称 -->
            <version>4.12</version>
            <!-- 依赖范围:test包下依赖该设置 -->
            <scope>test</scope>
        </dependency>
    </dependencies>
    <!-- 项目构建配置,配置编译、运行插件等。-->
    <build>......</build>
</project>

④ Maven的坐标

什么是坐标

         在平面几何中坐标(x,y)可以标识平面中唯一的一点。在Maven中坐标就是为了定位一个唯一确定的jar包。
         Maven世界拥有大量构件,我们需要找一个用来唯一标识一个构建的统一规范。拥有了统一规范,就可以把查找工作交给机器。

Maven坐标主要组成

groupId:定义当前Maven项目组织名称
artifactId:定义实际项目名称
version:定义当前项目的当前版本或者是所依赖的jar包的版本

<groupId>com.kkb</groupId>
<artifactId>demoProject</artifactId>
<version>0.0.1-SNAPSHOT</version>

⑤Maven的生命周期

什么是生命周期

         Maven生命周期就是为了对所有的构建过程进行抽象和统一。包括项目清理、初始化、编译、打包、测 试、部署等几乎所有构建步骤。生命周期可以理解为构建工程的步骤。

Maven三大生命周期

Maven拥有三套相互独立的生命周期,分别是clean、default和site.

clean Lifecycle: 在进行真正的构建之前进行一些清理工作。 mvn clean
default Lifecycle: 构建的核心部分,编译,测试,打包,部署等等。
site Lifecycle: 生成项目报告,站点,发布站点。

clean生命周期

         clean的目的是清理项目。 每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比 如,运行mvn clean ,这个的clean是Clean生命周期的一个阶段。有Clean生命周期,也有clean阶段。

包含3个阶段:
1.pre-clean 执行一些清理前需要完成的工作
2.clean 清理上一次构建过程中生成的文件,比如编译后的class文件等
3.post-clean 执行一些清理后需要完成的工作

default生命周期- 构建项目

         所有生命周期中最核心的部分,绝大部分工作都发生在这个生命周期中。
咱们只介绍一些比较重要和常用的阶段:

generate-resources: 产生主代码中的资源在classpath中的包
process-resource: 复制并处理资源文件,至目标目录,准备打包。
compile: 编译项目的主源码.一般来说:编译src/main/java目录下的java文件至项目输出的主
classpath目录中
test-compile:编译项目的测试代码,是编译src/test/java目录下的java文件至项目输出的测试
classpath目录中
test:使用单元测试框架运行测试,测试代码不会被打包或部署.
package:打包成可发布的格式
install: 将包安装到Maven本地仓库,供本地其他Maven项目使用
deploy:将最终的包复制到远程仓库,供其他开发人员和Maven项目使用

PS:运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn install 的
时候,代码会被编译,测试,打包。此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理
解生命周期至关重要。
参考资料地址:http://Maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

site生命周期-生成项目站点

目的:建立和发布项目站点

pre-site 执行一些在生成项目站点之前需要完成的工作.
site 生成项目站点文档
post-site 执行一些在生成项目站点之后需要完成的工作.
site-deploy 将生成的项目站点发布到服务器上

在这里插入图片描述

                                                                                                 了解Maven是什么?
                                                                                                 Maven的安装和配置
                                                                                  如何使用IDEA搭建JaveWeb Maven项目


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小满@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值