Maven详细入门

2023-11-09

一、是什么

Maven是apache下的一个开源项目,是一款用于管理和构建java项目的工具
它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建。
它包含一个项目对象模型(POM)、一个依赖管理模型(Dependency)、一个构建生命周期(Build lifecyle)和一组用于构建生命周期的插件。

在这里插入图片描述

二、干什么
1.方便的依赖管理

官方介绍:

方便快捷的管理项目依赖的资源(jar包),避免版本的冲突问题。

传统方式,总结一下就是两个字:繁琐

需要自己下载相关jar包,然后手动导入jar包,并且还得注意jar包之间的版本配套情况
假设后期需要升级某个jar包的版本,不仅需要升级这个jar包,这个jar包所依赖的其他jar包都需要升级

使用Maven:

创建Maven项目,不需要再导入jar包,只需要在pom.xml文件中引入相关依赖,Maven会自动联网下载该依赖,并同时下载这个jar包所依赖的其他jar包,便于项目的一个升级。

2.统一的项目结构

官方介绍:

提供标准、统一的项目结构

原来的弊端:

使用不同的开发工具创建出来的java项目结构是不同的,也就是说eclipse创建的java项目无法直接导入到IDEA中去,IDEA创建的java项目也无法直接导入到eclipse中去。

在这里插入图片描述

使用Maven:

只要使用Maven这一工具,生成出来的项目结构都是统一的。

3.标准的项目构建流程

官方介绍:

标准跨平台(Linux、Windows、MacOS)的自动化项目构建方式

Maven提供了一套标准的构建流程。我们可以直接基于Maven提供的指令,快速完成项目的清理、编译、测试、打包、发布等操作,结果放入target文件夹下。

在这里插入图片描述

三、怎么用
1. Maven坐标

什么是坐标?

资源的唯一标识,通过该坐标可以唯一定义资源位置
使用坐标定义项目或引入项目中所需的依赖

Maven坐标主要组成

groupId:定义当前Maven项目隶属的组织名称(通常是域名反写)
artifactId:定义当前Maven项目名称(通常是模块名称)
version:定义当前项目版本号

    //定义项目
    <groupId>com.demo</groupId>
    <artifactId>maven-project01</artifactId>
    <version>1.0-SNAPSHOT</version>
    //引入依赖
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>3.4.1</version>
    </dependency>
2.依赖管理
2.1 依赖配置

依赖:指当前项目运行所需要的jar包,一个项目可以引入多个依赖
配置:

  1. 在pom.xml文件中编写dependencies标签
  2. 在dependencies标签中使用dependency引入坐标
  3. 定义坐标的groupId、artifactId、version
  4. 点击刷新按钮,引入最新加入的坐标
   <dependencies>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.0</version>
        </dependency>
    </dependencies>

注意事项:

如果引入的依赖,在本地仓库不存在,将会连接远程仓库/中央仓库,然后下载依赖。(这个过程会比较耗时,耐心等待)
如果不知道依赖的坐标信息,可以到https://mvnrepository.com/ 中搜索。

2.2 依赖传递

依赖具有传递性

直接依赖:在当前项目中通过依赖配置建立的依赖关系
间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源

如果不想间接依赖其他资源,可以使用exclusion排除依赖
换个问法:如何解决依赖传递引起的版本冲突。

排除依赖:指主动断开依赖的资源,被排除的资源无需指定版本

在这里插入图片描述

2.3 依赖范围

依赖的jar包,默认情况下,可以在任何地方使用。可以通过scope设置其作用范围。
作用范围:

主程序范围有效(main文件夹范围内)
测试程序范围有效(test文件夹范围内)
是否参加打包运行。(package指令范围内)

在这里插入图片描述

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
 </dependency>
2.4 生命周期

Maven生命周期就是为了对所有的maven项目构建过程进行抽象和统一。

Maven中有3套相互独立的生命周期:

clean:清理工作
default:核心工作,如:编译、测试、打包、安装、部署等
site:生成报告、发布站点等

每套生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。

在这里插入图片描述

clean:移除上一次构建生成的文件
compile:编译项目源代码
test:使用合适的单元测试框架进行测试
package:将编译后的文件进行打包,如:jar、war等
install:安装项目到本地仓库
deploy:拷贝最终的工程包到远程仓库中,以共享给其他的开发人员和工程

在这里插入图片描述

2.5 依赖原则

当依赖所层级不一样时:
最短路径优先原则(依赖传递的路径越短越优先)
当依赖层级一样时:
最先定义优先原则(路径长度一样,则先声明的优先)
特殊的最短路径优先原则:
直接依赖优先原则

3.解析机制
3.1 依赖解析机制
  1. 当依赖的范围是 system 的时候,Maven 直接从本地文件系统中解析构件。
  2. 根据依赖坐标计算仓库路径,尝试直接从本地仓库寻找构件,如果发现对应的构件,就解析成功。 如果在本地仓库不存在相应的构件,就遍历所有的远程仓库,发现后,下载并解析使用。
  3. 如果依赖的版本是 RELEASE 或 LATEST,就基于更新策略读取所有远程仓库的元数据文件 (groupId/artifactId/maven-metadata.xml),将其与本地仓库的元数据合并后,计算出 RELEASE 或者 LATEST 真实的值,然后基于该值检查本地仓库,或者从远程仓库下载。
  4. 如果依赖的版本是 SNAPSHOT,就基于更新策略读取所有远程仓库的元数据文件,将它与本地仓库对应的元数据合并,得到最新快照版本的值,然后根据该值检查本地仓库,或从远程仓库下载。如果最后解析得到的构件版本包含有时间戳,先将该文件下载下来,再将文件名中时间戳信息删除,剩下 SNAPSHOT 并使用(以非时间戳的形式使用)。

关于RELEASE 、LATEST和SNAPSHOT

LATEST:某个特定构建最新的发布版(RELEASE)或快照版(SNAPSHOT)
RELEASE:仓库中最后一个非快照版本
SNAPSHOT:特定时间的一个快照版本,maven的一个特殊版本号,maven在处理时,会把SNAPSHOT字符自动替换成时间。

3.2 插件解析机制

与依赖的构件一样,插件也是基于坐标保存在Maven仓库中。在用到插件的时候会先从本地仓库查 找插件,如果本地仓库没有则从远程仓库查找插件并下载到本地仓库。与普通的依赖构件不同的 是,Maven会区别对待普通依赖的远程仓库与插件的远程仓库。前面提到的配置远程仓库只会对普 通的依赖有效果。当Maven需要的插件在本地仓库不存在时是不会去我们以前配置的远程仓库查找 插件的,而是需要有专门的插件远程仓库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Maven详细入门 的相关文章

随机推荐

  • 利用python对b站某GPT-4解说视频的近万条弹幕进行爬取、数据挖掘、数据分析、弹幕数量预测及情绪分类

    目录 一 利用Python爬取弹幕 二 利用几行代码直接生成词云 三 将弹幕属性和内容放入mysql当中 四 分析弹幕在视频各节点的数量 1 分析视频各个片段出现的弹幕数量 2 分析视频各大章节出现的弹幕数量 3 分析视频各小节出现的弹幕数
  • Learning Java language Fundamentals

    Chapter 2 Learning Java language fundamentals exercises 1 What is Unicode Unicode is a computing industry standard for c
  • 炒股新手技巧

    技巧一 关于止损和止赢的问题 我觉得很重要 止赢和止损的设置对股民来说尤为重要 有很多散户会设立止损 但是不会止赢 今天有必要和大家探讨一下 止损的设立大家都知道 设定一个固定的亏损率 到达位置严格执行 但是止赢 一般的散户都不会 为什么说
  • 用mybatis批处理, 编程式事务,CompletableFuture异步处理,多线程,线程池,list 分页,实现多张表大批量插入

    目录 概述 准备工作 创建数据库表 创建Java实体类 创建MyBatis映射文件和DAO接口 编写Java代码实现多张表大批量插入的功能 总结 1 概述 在实际的开发中 我们经常需要将大量的数据插入到数据库中 如果使用单条插入的方式 会导
  • vs2017 找不到源文件stdio.h解决方法

    这个问题网上又不少人提出 我的vs出现这个问题是因为我电脑重装系统了 原来的项目所采用windows SDK 已经发生了变化 因此解决的办法是 项目 gt 属性 gt 配置属性 gt 常规 gt windows SDK版本 将其换成你现在的
  • 【论文阅读】【因果关系】

    文章目录 因果理论的三个层级 张含望 因果推理在计算机视觉中的进展 浙江大学助理教授况琨 因果推理和稳定学习 因果理论的三个层级 该篇是本人入门因果 CV的随笔 期间会借鉴记录别人的理解 引用的部分会给出原始连接 如有侵权请联系我删除 Ju
  • EEPROM AT24C08的操作

    EEPROM应该是学习IIC总线时候最先接触的东西了 EEPROM的优点是可以随机存取 不像Flash存储器一样需要先擦除在能写入 而且擦写次数多存储时间长 但是缺点是存储空间非常有限 像我这用的Atmel的AT24C08只有8Kbit的存
  • Java异常机制Throwable

    Java中异常的概念以及处理异常 在Java程序运行期间出现了一个错误 这个错误可能是由于文件包含了错误信息 或者是由于网络连接出现问题 也可以是因为使用了无效的数组下标 或者是试图使用一个没有被赋值的对象引用而造成的 我们称这样的错误为异
  • canvas 简单用法

    canvas使用方法 1 首先要获取页面中的画布 var canvas document querySelector canvas 2 创建画笔 var context canvas getContext 2d 3 选择要绘画的方式 进行绘
  • Linux C/C++ Openssl RSA Encrypt/Decrypt(加密/解密) 简单示例教程

    PEM文件有以下格式 PEM私钥文件格式 BEGIN RSA PRIVATE KEY END RSA PRIVATE KEY 生成该密钥的Linux命令 OpenSSL gt genrsa out privateKey pem 1024 读
  • 100天精通Python(基础篇)——第2天:注释

    文章目录 一 注释的作用 二 单行注释如何定义 三 多行注释 一 注释的作用 1 注释是代码中的解释型语句 用来对代码内容进行注释 2 注释不是代码 不会被程序执行 二 单行注释如何定义 通过 号定义 建议在 和注释内容之间 间隔一个空格
  • 锚点

    在制作网页时 我们常常遇到需要添加侧边导航 通过点击导航让页面自动滚动到指定位置 如 电商网站的楼层 这就涉及到 a 标签的锚点应用 把它称为 锚点标签 一 锚点 我们想要让页面跳转到的位置 就是锚点 锚点是一种超链接 只不过它是页面内部的
  • 使用Html做一个简单的登陆页面

    目录 绪论 一 新建一个html项目 二 制作整体框架 三 使用CSS进行修饰 绪论 html作为一个常用的前端语言 使用的人群范围是很大的 如果你想要成为一个前端工程师 那必不可少的就要做一个登陆页面 登录页面一般就是账号和密码 另外还需
  • 一文读懂:什么是RFID

    在物联网领域 我们经常听到 RFID 这个词 接下来讲解一下 什么是 RFID 个人技术公众号 解决方案工程师 欢迎同领域的朋友关注 相互交流 RFID 全称为 Radio Frequency Identification 中文称 射频识别
  • VRRP与DHCP

    目录 一 VRRP 1 VRRP基本概述 2 VRRP基本机构 3 设备类型 4 工作原理 5 VRRP主备备份过程 二 DHCP 1 应用场景 2 工作原理 一 VRRP 1 VRRP基本概述 VRRP 虚拟路由器冗余协议 VRRP能够在
  • 软件架构之架构视图

    软件架构设计运用RUP4 1视图方法进行设计 4 1架构视图模型是1995年Philippe kruchen在 IEEE software 上发表的题为 The 4 1 View Model of Architecture 文 主要包括的架
  • Linux shell编程(三)shell脚本中的特殊变量详解

    1 环境变量 全局变量 环境变量一般使用export内置命令导出的变量 用于定义shell运行环境 保证shell命令能够正确执行 shell通过环境变量来确定登录的用户名等信息 所有的环境变量都是系统的全局变量 环境变量可以在命令行中创建
  • JMeter快速入门知识系列(12)----JMeter集合点

    12 1 集合点的定义 在性能测试过程中 为了真实模拟多个用户同时进行操作以度量服务器的处理能力 可以考虑同步虚拟用户以便恰好在同一时刻执行操作或发送请求 通过插入集合点可以较真实模拟多个用户并发操作 注意 虽然通过加入集合点可以约束请求同
  • Oracle为用户设置读权限

    Oracle 数据库中创建表只读用户 并为其设置密码永不过期 同义词 1 创建用户 create user test identified by 123456 default tablespace db temporary tablespa
  • Maven详细入门

    Maven 一 是什么 二 干什么 1 方便的依赖管理 2 统一的项目结构 3 标准的项目构建流程 三 怎么用 1 Maven坐标 2 依赖管理 2 1 依赖配置 2 2 依赖传递 2 3 依赖范围 2 4 生命周期 2 5 依赖原则 3