Maven详解

前言


在现代软件开发中,项目管理变得至关重要。从依赖管理到构建流程,每个环节都直接影响到项目的质量和效率。在这个背景下,Maven以其强大的依赖管理、标准化的项目结构和自动化构建流程成为项目管理的得力助手。本文将深入探讨Maven的各个方面,帮助您更好地理解这个强大的工具。让我们一起探索Maven的世界,看看它是如何简化项目管理的。


一、Maven是什么?

Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和 依赖管理。

什么是构建?

指的是项目从编译、测试、运行、打包、安装 ,部署整个过程都交给maven进行管理,这个过程称为构建。

构建的常用命令

①clean清理:删除以前的编译结果,为重新编译做好准备。
②compile编译:将 Java 源程序编译为字节码文件。
③test测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
④package打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web 工程对应 war 包。
⑤install安装:在 Maven 环境下特指将打包的结果——jar 包或 war 包安装到本地仓库中。


为什么引入Maven?Maven的功能?

引入原因:Maven为开发人员提供了一种方便、快速、可靠的方式来构建和管理项目。它采用了一种系统化的方式来管理项目,使得开发人员可以更加高效地构建、测试、文档化和部署软件项目。

maven的功能:

  • 提供了一套标准化的项目结构

所有IDE使用Maven构建的项目完全一样,可以大大提高项目的管理效率和代码的复用性。

  • 管理依赖

Maven通过一个坐标系统准确地定位每一个构建(artifact),也就是通过一组坐标 Maven 能够找到任何一个 Java 类库。这使得开发人员可以方便地管理项目的依赖关系,避免了手动搜索和下载jar包的繁琐过程。

  • 自动化构建

Maven提供了一系列的命令和插件,可以自动完成编译、测试、打包、部署等操作,大大简化了项目的构建流程。

  • 统一配置:

Maven为每个项目提供统一的配置,使得开发人员可以更加方便地管理和维护项目。

二、Maven的使用

Maven的下载:

Apache-maven-3.6.0下载地址:Index of /dist/maven/maven-3/

由于我使用的是2022版本的idea,仅支持maven3.8.1及以下版本,请读者自行找到对应的maven版本并进行下载.

解压后目录如下:

目录结构

Maven详解_第1张图片

bin:存放了maven的命令,比如我们前面用到的mvn tomcat:run

boot:存放了一些maven本身的引导程序,如类加载器等

conf:存放了maven的一些配置文件,如settings.xml文件

lib:存放了maven本身运行所需的一些jar包

配置环境变量

 maven环境变量配置参考以下博文

http://t.csdnimg.cn/7cWVb

三、Maven仓库

1.仓库的作用:

  1. 统一管理:可以集中存储和管理项目的构件,包括JAR、WAR、ZIP等格式的文件。这些构件可以被多个项目共享和重用,避免了重复的构建和部署,提高了开发效率。
  2. 方便的版本管理:Maven仓库通过版本管理,可以方便地跟踪和管理项目的构件。开发人员可以通过指定构件的版本号,获取到不同版本的构件,从而保证项目的稳定性和一致性。
  3. 自动下载和更新:Maven仓库提供了自动下载和更新构件的功能,开发人员只需要在项目的POM文件中指定所需的构件坐标,Maven就能够自动从仓库中下载和更新这些构件,简化了项目的构建和部署过程。
  4. 加速构建速度:Maven仓库的本地缓存机制能够加速构件的下载速度,提高构建效率。

2.仓库分类

  • 本地仓库(local) :用来存储从远程仓库或中央仓库下载的插件和jar包,项目使用的一些插件或jar包,优先从本地仓库查找
  • 远程仓库(remote):如果本地需要插件或者jar包,本地仓库没有,默认去远程仓库下载。一般都是一些其他公司提供的Maven仓库,如阿里云的
  • 中央仓库(central):Maven团队维护,存储所有资源的仓库
  • 私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源

本地仓库(local) :

顾名思义,就是Maven在本地存储构件的地方。

maven的本地仓库,在安装maven后并不会创建,它是在第一次执行maven命令的时候才被创建

maven本地仓库的默认位置:无论是Windows还是Linux,在用户的目录下都有一个.m2/repository/的仓库目录,这就是Maven仓库的默认位置.

本地仓库的配置:

在某盘中新建一个文件夹,用作本地仓库,命名建议localRepository

在F:\software_java\apache-maven-3.6.0\conf\settings.xml文件中配置本地仓库位置(maven的安装目录下):打开settings.xml文件,配置如下:

Maven详解_第2张图片

提示:注意本地仓库的路径符号:使用/不能使用\

F:/localRepository

Maven国内仓库镜像的配置(远程仓库配置)

Maven 默认使用中央仓库作为远程仓库,缺点:速度慢(服务器在国外),在国内开发可以考虑换成阿里的镜像(国内服务器)代替中央。

在 settings.xml 下找到 节点,并在节点下增加镜像配置

	
	
	  alimaven
	  aliyun maven
	  https://maven.aliyun.com/nexus/content/repositories/central/
	  central
	
	

id:唯一标识一个镜像

- name:镜像名称

- url:镜像地址

- mirrorOf:代表一个镜像的替代位置,例如central就表示代替官方的中央仓库

注意:标签一定要放在标签中

依赖范围

  • compile(编译范围):这是默认的依赖范围。在编译、测试和运行时都需要这个依赖。编译范围的依赖会被用在编译、测试、运行,由于运行时需要,所以编译范围的依赖会被打包。
  • provided(提供范围):这个范围的依赖只有当JDK或者一个容器已提供该依赖之后才使用。例如,servlet-api被Tomcat容器提供了,所以不会被打包。provided依赖在编译和测试时需要,在运行时不需要。
  • runtime(运行时范围):这个范围的依赖在运行和测试系统时需要,但在编译时不需要。例如,jdbc的驱动包。由于运行时需要,所以runtime范围的依赖会被打包。
  • test(测试范围):这个范围的依赖在编译和运行时都不需要,只在测试编译和测试运行时需要。例如,Junit。由于运行时不需要,所以test范围依赖不会被打包。一般不推荐使用。
  • system(系统范围):与provided范围类似,这种范围的依赖表示项目在本地有该依赖,但是不会将其打包到最终的部署包中。

依赖添加的运行流程:

Maven项目每次在pom.xml文件中添加jar依赖坐标时,都会先从本地仓库查找判断是否存在,如果本地仓库中没有指定坐标的jar,那么就自行到配置文件(安装包的conf目录中的settings.xml)中配置的远程仓库(默认配置的是中央仓库,也就是Maven公司的jar仓库)中下载,下载成功后将jar添加到本地仓库缓存(下次在其他项目中添加依赖时,就可以直接引用),然后引用到项目中

依赖下载失败的情况以及解决办法

Maven中依赖下载失败的情况可能有多种原因,以下是一些常见的情况和相应的解决办法:

  1. 网络问题

    • 问题描述:由于网络连接问题,Maven无法从中央仓库或其他远程仓库下载依赖。
    • 解决办法:检查网络连接是否正常,确保可以访问到Maven配置的仓库地址。如果使用代理服务器,请确保代理设置正确。
  2. 仓库地址问题

    • 问题描述:Maven配置的仓库地址不正确,或者远程仓库不可用。
    • 解决办法:检查pom.xml文件中配置的仓库地址是否正确,并确保该仓库地址是可访问的。可以尝试更换其他可用的仓库地址。
  3. 依赖冲突

    • 问题描述:项目中的依赖存在版本冲突,导致某些依赖无法下载。
    • 解决办法:使用Maven的dependency:tree命令检查依赖树,找出冲突的依赖并进行相应的版本调整。
  4. 代理和防火墙问题

    • 问题描述:由于代理服务器或防火墙设置不当,导致Maven无法下载依赖。
    • 解决办法:检查代理服务器和防火墙设置,确保它们允许Maven访问远程仓库。如果使用代理服务器,请在Maven的配置文件settings.xml中正确配置代理设置。
  5. 本地仓库问题

    • 问题描述:本地仓库中存在损坏的依赖或过时的缓存,导致Maven无法下载新的依赖。
    • 解决办法:清理本地仓库中的缓存,删除损坏的依赖,然后重新构建项目。可以通过删除本地仓库的相关文件夹并重新执行Maven命令来完成清理操作。
  6. 版本号不正确或不存在

    • 问题描述:在pom.xml文件中配置的依赖版本号不存在或已经过时。
    • 解决办法:检查pom.xml文件中配置的依赖版本号,确保它们是正确的并且是可用的版本。可以尝试更换其他可用的版本号。
  7. 镜像仓库问题

    • 问题描述:Maven配置了镜像仓库,但由于镜像仓库的问题导致依赖无法下载。
    • 解决办法:检查镜像仓库的配置是否正确,并确保镜像仓库是可用的。如果使用阿里云等商业镜像仓库,请确保账户和配置正确。

四、maven的概念模型

Maven的概念模型主要部分:

项目对象模型(Project Object Model)

一个Maven工程都有一个pom.xml文件,通过pom.xml文件定义项目的坐标、项目依赖、项目的信息、插件信息等。

以下代码列出了pom.xml中常见标签的解释

   modelVersion: 指定当前 POM 的模型版本,通常这个值都是 4.0.0。

 4.0.0
    

parent: 指定项目的父项目。多模块项目或继承关系中常用。

  • groupId: 定义项目属于哪个组。这通常是组织的唯一标识符,如公司的域名反转(如 com.example)。

  • artifactId: 定义项目的基本名称。

  • version: 指定项目的版本。


        org.springframework.boot
        spring-boot-starter-parent
        2.2.12.RELEASE
 

  properties中用于定义一些属性,比如编译版本、编码格式以及一些依赖库的版本号。

 
        8
        8
        UTF-8
        2.2.2
        
        1.2.11
        
        5.1.38
    

dependencies: 列出项目的所有依赖。

 
        
            org.springframework.boot
            spring-boot-starter-web
        
       
    
依赖管理系统(Dependency Management System)

通过Maven的依赖管理对项目所依赖的jar包进行统一的管理。

  1. 统一管理:通过在pom.xml文件中声明依赖,Maven可以统一管理项目中的所有依赖。无论项目需要使用多少个库或插件,都可以在pom.xml文件中集中声明和管理。
  2. 自动解析和下载:当项目需要某个依赖时,Maven会自动从配置的仓库中下载并解析该依赖。这意味着开发人员无需手动下载和添加jar包到项目中。
  3. 版本管理:通过依赖管理系统,可以方便地管理依赖的版本号。开发人员可以在pom.xml文件中指定依赖的版本,Maven会自动处理版本冲突和依赖关系。
  4. 传递性依赖:Maven会自动解析传递性依赖,即一个依赖的依赖。这意味着当项目引入某个库时,该库所依赖的其他库也会被自动解析和包含在项目中。
  5. 中央仓库:Maven默认从中央仓库下载依赖。中央仓库包含了大量常用库和插件,可以满足大多数项目的需求。同时,Maven还支持自定义仓库和第三方仓库。
项目生命周期(Project Lifecycle)

Maven的生命周期被划分为三个内置的生命周期,分别是clean、default和site。每个生命周期都包含一系列的阶段,这些阶段按照特定的顺序执行,以完成项目的构建过程。

clean生命周期:用于清理项目构建过程中生成的文件。

default生命周期:用于项目的编译、测试、打包和部署等核心构建任务。

site生命周期:用于生成和发布项目的站点文档。

  1. 阶段的执行:在Maven的生命周期中,每个阶段都是按照顺序执行的。当执行某个阶段时,它之前的所有阶段都会被自动执行(除非明确指定跳过某些阶段)。这种机制确保了项目构建的有序性和完整性。

  2. 插件的绑定:Maven的生命周期本身并不执行任何具体的构建任务,而是通过插件来完成的。每个阶段都可以绑定一个或多个插件的目标(goal),插件目标是实际执行构建任务的单元。当执行某个阶段时,Maven会调用该阶段绑定的插件目标来完成相应的构建任务。

  3. 自定义生命周期:除了内置的生命周期外,Maven还支持自定义生命周期。开发人员可以根据项目的需求,定义新的生命周期和阶段,并绑定相应的插件目标。这提供了更大的灵活性和扩展性,以适应不同项目的构建需求。

插件(plugin)目标(goal)

maven管理项目生命周期过程都是基于插件完成的。

maven概念模型图:(图源:百度)

Maven详解_第3张图片

参考资料:

Maven详解之仓库------本地仓库、远程仓库 - duanxz - 博客园 (cnblogs.com)

http://t.csdnimg.cn/2JRlO


总结

Maven的依赖管理机制、标准化项目结构以及自动化构建流程大大简化了项目的复杂性。在项目管理中,正确使用Maven可以显著提高开发效率,降低维护成本,使团队能够更加专注于业务逻辑的实现和创新.

你可能感兴趣的:(maven,java)