Maven 知识点总结

文章目录

  • Maven
    • 1、Maven 坐标
    • 2、Maven 仓库
    • 3、Maven 依赖
      • 依赖配置
      • 依赖范围
      • 依赖调解原则
      • 排除依赖
    • 4、Maven 生命周期
    • 5、Maven 聚合与继承

Maven

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

  • 项目对象模型(Project Object Model):一个maven工程都有一个pom.xml文件,通过pom.xml文件定义项目的坐标、项目依赖、项目信息、插件目标等。
  • 项目生命周期(Project Lifecycle):使用maven完成项目的构建,项目构建包括:清理、编译、测试、部署等过程,maven将这些过程规范为一个生命周期。
  • 依赖管理系统(Dependency Management System):通过maven的依赖管理对项目所依赖的jar 包进行统一管理。
  • 插件(plugin):maven 管理项目生命周期过程都是基于插件完成的。
  • 一组标准集合:maven将整个项目管理过程定义一组标准,比如:通过maven构建工程有标准的目录结构,有标准的生命周期阶段、依赖管理有标准的坐标定义等。

Maven的两个核心作用

  1. 依赖管理:Maven把项目所需要得jar包保存在Maven仓库里面,通过在pom.xml文件中添加所需jar包的坐标,在用到这些jar包时,会根据pom.xml中jar包的坐标把jar包引入进来拿去执行
  2. 项目构建:指的是项目从编译、测试、运行、打包、安装 ,部署整个过程都交给maven进行管理,使用maven一个命令可以轻松完成整个工作,本质上 Maven 是一个插件执行框架,所有的执行过程,都是由一个一个插件独立完成的

1、Maven 坐标

gav,项目中依赖的第三方库以及插件可统称为构件(也可以叫依赖)。每一个构件都可以使用 Maven 坐标唯一标识,也就是说通过 Maven 坐标,我们就可以找到对应的唯一的构件,坐标元素包括:

  • groupId,该 Maven 项目隶属的公司或组织
  • artifactId,当前 Maven 项目的名称,项目的唯一标识符
  • version:定义了当前 Maven 项目所处的版本
  • packaging(可选):定义了 Maven 项目的打包方式(比如 jar,war…),默认使用 jar
  • classifier(可选):常用于区分从同一 POM 构建的具有不同内容的构件,可以是任意的字符串,附加在版本号之后

2、Maven 仓库

本地仓库:settings.xml 文件中可以看到 Maven 的本地仓库路径配置,默认本地仓库路径是在 ${user.home}/.m2/repository。

远程仓库:官方或者其他组织维护的 Maven 仓库,远程仓库可以分为三种:

  • 中央仓库:这个仓库是由 Maven 社区来维护的,里面存放了绝大多数开源软件的包,并且是作为 Maven 的默认配置,但是国内访问较慢,一般我们会通过配置镜像来加速。
  • 私服:私服是一种特殊的远程 Maven 仓库,它是架设在局域网内的仓库服务,私服一般被配置为互联网远程仓库的镜像,供局域网内的 Maven 用户使用,公司一般都会采用私服作为远程仓库。
  • 其他的公共仓库:有一些公共仓库是为了加速访问(比如阿里云 Maven 镜像仓库)或者部分构件不存在于中央仓库中。

Maven 依赖包寻找顺序:先本地仓库 -> 后远程仓库 -> 都没有则报错

3、Maven 依赖

依赖配置

dependencies:一个 pom.xml 文件中只能存在一个这样的标签,是用来管理依赖的总标签。

dependency:包含在 dependencies 标签中,可以有多个,每一个表示项目的一个依赖。

groupId,artifactId,version(必要):依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven 根据坐标才能找到需要的依赖。

type(可选):依赖的类型,对应于项目坐标定义的 packaging。大部分情况下,该元素不必声明,其默认值是 jar。

scope(可选):依赖的作用范围,默认值是 compile。

optional(可选):标记依赖是否可选

exclusions(可选):用来排除传递性依赖,例如 jar 包冲突

依赖范围

classpath 用于指定 .class 文件存放的位置,类加载器会从该路径中加载所需的 .class 文件到内存中。

Maven 编译、测试、运行有三套不同的 classpath:

  • 编译 classpath:编译主代码有效
  • 测试 classpath:编译、运行测试代码有效
  • 运行 classpath:项目运行时有效

Maven 的依赖范围如下:

  • compile:编译依赖范围(默认),使用此依赖范围对于编译、测试、运行三种都有效,即在编译、测试和运行的时候都要使用该依赖 Jar 包。
  • provided:此依赖范围,对于编译和测试有效,而对运行时无效。典型如 lombok。
  • runtime:运行时依赖范围,对于测试和运行有效,但是在编译主代码时无效,典型的就是 JDBC 驱动实现。
  • test:测试依赖范围,从字面意思就可以知道此依赖范围只能用于测试,而在编译和运行项目时无法使用此类依赖,典型的是 JUnit,它只用于编译测试代码和运行测试代码的时候才需要。
  • system:系统依赖范围,使用 system 范围的依赖时必须通过 systemPath 元素显式地指定依赖文件的路径,不依赖 Maven 仓库解析,所以可能会造成构件不可移植。
  • import:将其他模块定义好的 dependencyManagement 导入当前 Maven 项目 pom 的 dependencyManagement 中,不会对三种classpath产生影响。

依赖调解原则

1、对于 Maven 而言,同一个 groupId 同一个 artifactId 下,只能使用一个 version。若相同类型但版本不同的依赖存在于同一个 pom 文件,只会引入后一个声明的依赖

2、由于 Maven 的依赖传递,如果项目的两个依赖同时引入了某个版本不一致的依赖,则会产生冲突

两个原则:最短路径优先 和 声明顺序优先

假设 A->B->C->X(2.0),A->D->X(1.0),则 X(1.0) 会被引用。

假设 A->B->C->X(1.0),A->D->C->X(2.0),如果 B 声明在 D 之前,则X(1.0)被引用,反之。

此时可通过依赖分析,找到有冲突的依赖,比如使用 IDEA插件 Maven Helper 等

排除依赖

如果只依靠 Maven 进行依赖调解,很多情况下是不能满足的,需要手动排除依赖。

还是 A->B->C->X(2.0),A->D->X(1.0) 这个例子,根据最短路径优先原则,我们引入了 X(1.0),但是如果 C 用到了某个 X(1.0) 没有的类或者方法,就会报找不到类/方法的错误(NoSuchMethodError 和 ClassNotFoundException)。

此时,就需要我们通过 exclusion 标签将 X(1.0) 给排除,这样 Maven 就会引用 X(2.0)。

在解决依赖冲突的时候,一般会优先保留版本较高的。这是因为大部分 jar 在升级的时候都会做到向下兼容。

4、Maven 生命周期

image-20230905224945006

Maven 标准生命周期作用
clean项目清理(删除 target目录)
default(build)项目部署
site项目站点文档创建

我们平时接触最多的就是 default 生命周期,并且七个核心阶段都是顺序执行的。

核心阶段作用
validate验证项目是否正确,所有必要信息是否可用(很少单独使用)
compile编译项目的源代码(将src/main中的java代码编译成class文件,输出到targe目录下)
test将单元测试的资源文件和代码进行编译,生成的文件位于target/test-classes (打包部署请跳过该阶段)
package把class文件,resources文件打包成jar包(也可以是war包),生成的jar包位于target目录下
verify检查包是否有效(很少单独使用)
install将jar部署到本地仓库,本地的其他模块依赖该jar包时,可以直接从本地仓库去获取
deploy将jar包部署到远端仓库,需要在maven的setting.xml中配置私服的用户名和密码,以及在pom.xml配置

也就是说,如果我们执行了 mvn package,会从 mvn validate 开始一直执行到 package,其他同理。但是不会执行 mvn clean,因为 clean、site、default 都是独立的生命周期。因此,保险起见,在执行 package、install、deploy 之前先 clean。

5、Maven 聚合与继承

聚合:对于复杂的Maven项目,一般建议采用多模块的方式来设计开发,便于后期维护管理。但是构建项目时,如果每次都需要按模块一个一个进行构建会十分麻烦,而Maven的聚合功能就可以很好的解决这个问题,当用户对聚合模块执行构建任务时,会对所有被其聚合的模块自动地依次进行构建任务。

继承:在一个多模块的项目中,对于同一个依赖的依赖声明要在多个模块的POM都进行声明,会导致有大量重复的依赖声明。所以Maven在设计之时,借鉴了面向对象中的继承思想,可在父模块的POM中声明依赖,子模块的POM文件可通过继承父模块的POM来获得对相关依赖的声明。对于父模块而言,其目的是为了消除子模块的POM文件的重复配置,其不含有任何实际的项目代码,所以父模块POM文件的packaging元素同样需要设置为pom。

参考文章&推荐阅读

Maven – 构建生命周期简介 (apache.org)

高效使用Java构建工具|Maven篇 (qq.com)

maven学习笔记(超详细总结) - clear_love8 - 博客园 (cnblogs.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/131349.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无人机通信协议MAVLink简介

Micro Air Vehicle Link(简称MAVLink)用于无人系统(例如,机器人、无人机、无人车、无人船和无人潜航器)。它定义了一组无人系统和地面站之间的消息交换规则。此协议广泛用于无人驾驶系统中,特别是ArduPilot和PX4无人驾驶系统,MAVLink协议提供了强大的功能,不仅用于监视…

Linux安装Redis(详细教程)

Linux安装Redis 注:希望将redis安装到此目录 /usr/local/redis 希望将安装包下载到此目录 /usr/local/src 可自己选择 1.创建安装目录/usr/local/redis mkdir /usr/local/redis 2.进入安装包目录 cd /usr/local/redis 3.进行下载安装包 wget https://download…

用python实现基本数据结构【03/4】

说明 如果需要用到这些知识却没有掌握,则会让人感到沮丧,也可能导致面试被拒。无论是花几天时间“突击”,还是利用零碎的时间持续学习,在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢?列表、字典、集…

JDK8新特性--函数式接口--(Consumer的概念理解,模拟练习,企业实战)全流程彻底搞懂

背景,起因是因为在项目开发过程中,发现了一处代码的写法觉得很新奇看不懂,了解后发现是用到了函数式接口的知识。特此学习记录,整体过程梳理在本文。如果你不满足就会写个CURD,业务代码只会new来new去,代码…

软件工程评级B-,有大量调剂名额。北京联合大学考情分析

北京联合大学(B-) 考研难度(☆) 内容:23考情概况(拟录取和复试分析)、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1239字,预计阅读:3分钟 2023考情概况 北京…

从零开始-与大语言模型对话学技术-gradio篇(4)

前言 本文介绍「星火杯」认知大模型场景创新赛中的落选项目- AI命理分析系统,属于个人娱乐练手。总结提炼了往期文章精华并发掘出新的知识。 包括本地部署版本和Web在线版本,两种打包方式基于 半自动化使用.bat手动打包迁移python项目 如何把 Gradio …

Java——》synchronized互斥性

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

你应该知道的几个国产化平台-行云管家

近年来我国国产化加速发展,国产化平台也越来越多。但还有很多小伙伴不知道有哪些,这里就给大家汇总几个,大家应该知道的国产化平台。 你应该知道的几个国产化平台 1、cpu:龙芯、飞腾、鲲鹏、兆芯、海光、申威 2、浏览器&#xf…

Vercel的下一件大事:AI SDK和开发人员加速器

Vercel CEO Guillermo Rauch说,构建AI应用程序是开发人员注册Vercel的第二大原因。Ergo:Vercel AI SDK和加速器。 在 2020 年代,很少有公司比流行的 React 框架 Next.js 的管理者 Vercel 对前端开发人员生态系统产生更大的影响。当我在 2020…

骨传导耳机怎么听到声音?骨传导耳机是否会对听力造成损害?

其实骨传导耳机让我们听到的的传声原理很简单,而且骨传导现象很常见,简单的来说,就是像我们平时吃薯片或者挠头发,无论声音再小,自己也能听见,这就是骨传导的现象,也是为啥骨传导耳机不需要入耳…

GitHubGiteeGitlab极狐(JihuLab)同时生成并配置SSH公私钥详细过程

GitHub-微软-github.com Gitee-开源中国- gitee.com Gitlab-乌克兰GitLab 公司-gitlab.com 极狐(JihuLab)-中国代理商运营的Gitlab -gitlab.cn或者jihulab.com 使用SSH公钥可以让你在你的电脑和GitHub等平台通讯的时候使用更安全的连接(Git的Remote要使用SSH地址&a…

计算机竞赛 大数据疫情分析及可视化系统

文章目录 0 前言2 开发简介3 数据集4 实现技术4.1 系统架构4.2 开发环境4.3 疫情地图4.3.1 填充图(Choropleth maps)4.3.2 气泡图 4.4 全国疫情实时追踪4.6 其他页面 5 关键代码最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 大数据疫…

vue应用全局音乐(自动播放)

这里写自定义目录标题 1.从同事哪里白嫖过来的&#xff0c;主要是jq写的&#xff0c;需要单独引入jq cdn 2.打开index.html 将代码放到里面 <!DOCTYPE html> <html><head><meta charset"utf-8" /><metaname"viewport"content…

软件设计——面向对象的七大原则

前言 软件设计模式和设计原则是成为一个软件架构师的基本功&#xff0c;较好的理解这些基础知识无疑是十分重要的。在这篇文章中荔枝将会比较详细梳理一下面向对象的七大原则&#xff0c;大家可以先看看这部分内容再去学习设计模式会比较好哈哈哈哈~~~ 在软件开发中&#xff0c…

Linux RPM JDK升级

以JDK1.8升级JDK17为例 上传jdk17安装包到linux服务器 检查jdk版本 rpm -qa|grep jdk 删除查询到的jdk rpm -e --nodeps jdk1.8-1.8.0_201-fcs.x86_64 删除完毕后安装新的jdk rpm -ivh jdk-17_linux-x64_bin.rpm 检查jdk版本 java -version

深入探讨基于python的SGBM参数影响效果

什么是SGBM SGBM&#xff08;Semi-Global Block Matching&#xff09;是一种用于计算双目视觉中视差&#xff08;disparity&#xff09;的半全局匹配算法&#xff0c;在OpenCV中的实现为semi-global block matching&#xff08;SGBM&#xff09;。它是基于全局匹配算法和局部匹…

Matlab 2016安装MinGW-w64-4.9.2

Matlab 2016安装MinGW-w64-4.9.2 项目需求&#xff1a;需要将matlab中的.m文件编译为cpp文件 .dll .h .lib。 我相信大家在对matlab2016安装MinGW-w64出现了各种各样的问题。如&#xff1a;4.9.2安装失败&#xff1b;安装了其他版本但是matlab检测不到&#xff0c;或者其他各种…

Matlab之DICOM(数字图像和通信医学)格式图像数据读取函数dicomread

一、DICOM是什么&#xff1f; DICOM是数字图像和通信医学格式的图像数据&#xff0c;在MATLAB中&#xff0c;可以使用dicomread函数读取DICOM格式的图像数据。 二、dicomread函数 使用方法如下&#xff1a; imageData dicomread(filename);其中&#xff0c;filename表示DI…

pdfjs解决ie浏览器预览pdf问题

pdfjs是一个js库&#xff0c;可以将pdf文件用canvas重新绘制&#xff0c;从而无需借助pdf读取插件就可以直接预览。 目前chrome内核的浏览器已内置pdf读取插件&#xff0c;但ie浏览器还没有。而我们最近在做的一个项目使用对象是医院&#xff0c;使用的浏览器竟然还是ie。所以我…

基础秘钥、公钥、地址的熟悉指南

1. 地址 0基础漫画式阅读&#xff1a;https://www.cnblogs.com/charlesblc/p/6130433.html 清晰详细的地址生成解释&#xff1a;比特币&#xff1a;账户私钥、公钥、地址的生成 - kumata - 博客园 (cnblogs.com) 对原理更详细解释&#xff1a;区块链技术核心篇之二&#xff…