当前位置: 首页 > news >正文

maven相关概念深入介绍

1. pom.xml文件

就像Make的MakeFile、Ant的build.xml一样,Maven项目的核心是pom.xml。POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。

2. 坐标

1 )坐标的概念:

在Maven中坐标是构件的唯一标识,Maven坐标的元素包括groupId、artifactId、version、packaging、classifier。上述5个元素中,groupId、artifactId、version是必须定义的,packaging是可选的(默认为jar)。

2)坐标的意义:

- Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范。 - 拥有了统一规范,就可以把查找工作交给机器。

3)坐标的含义:

- groupId:组织标识,一般为公司网址的反写 + 项目名。 - artifactId:项目名称,一般为项目名 - 模块名。 - version:版本号,形式为0.0.1-SNAPSHOT : - 第一个0表示大版本号,第二个0表示分支版本号,第三个0表示小版本号。 - SNAPSHOT -- 快照版本,ALPHA -- 内侧版本,BETA -- 公测版本,RELEASE -- 稳定版本,GA -- 正式发布。 - packaging:打包的方式,如:pom, jar, maven-plugin, ejb, war, ... - classifier:用来帮助定义构件输出的一些附属构件。

3.自己项目的坐标

4.第三方项目坐标

5.依赖

1)依赖的意义

当编写Java代码时,我们总是需要一些库,例如,做单元测试我们需要JUnit库。对于更大的项目,我们可能需要创建自己的库并在不同的部分使用它的项目。不同的项目需要不同版本的库。 保持项目最新的库JAR文件的正确版本不是一个容易的任务。

每个外部JAR可能还依赖于其他外部JAR文件等。以递归方式下载所有这些外部依赖JAR文件并确保下载正确的版本是一项巨大的任务。

当项目越来越大,我们将需要越来越多的外部依赖。

Maven将下载它们并将它们放在您的本地Maven存储库中。

我们可以在POM文件中的dependencies元素内指定依赖关系。

 2)依赖的使用

例如我们的项目需要进行单元测试,则需要使用到junit-4.9.jar包,使用maven引用该依赖的方式如下:

属性说明:

      • 三维坐标:引用依赖包的三维坐标,用来定位该依赖包;
      • scope: 控制该依赖包在什么情况下会被加到 classpath 中;

3)第三方依赖的查询

我们在不确定所需引用的第三方依赖包的坐标时,通过maven的中央仓库进行查找,网址: https://mvnrepository.com/;

以mybatis举例:

 

 

 

 

 4)依赖的范围:

Maven项目在开发工程中有三套classpath

  • 主代码:main下面的都是主代码在编译的时候的依赖
  • 测试代码:test下是测试代码编译的时候的依赖
  • 运行时:main代码在运行的时候对包的依赖

依赖范围的使用,通过在引用第三方依赖时的<scope></scope>标签进行设置,例如:

 

共 6 种 scope,包括:compileprovidedruntimetest、system、import。例如上图的junit,只在测试中使用,则选择test即可,默认为compile

  • Compile:编译依赖范围。默认使用此依赖范围,其下的maven依赖,对于编译,测试,运行classpath都有效。
  • Test:测试依赖范围。只对测试classpath有效,编译主代码或运行项目时无法使用此依赖。典型例子如junit。
  • Provided:已提供依赖范围。其对于编译与测试classpath有效,运行时无效。如在web开发时,只有在编译和测试时才用到servlet-api,将其设置为此范围,在运行时servlet-api由web容器提供,无须依赖。并且在打war包时,此范围的依赖不会打在WEB-INF/lib下。
  • Runtime:运行时依赖范围。与provided相对,运行时classpath有效。典型例子如jdbc(编写是接口规范运行是提供具体实现类需要jar包)

 

5)依赖传递和可选依赖

应用场景:

第一直接依赖: HelloFriend项目依赖Hello项目

第二直接依赖: MakeFriend项目依赖HelloFriend项目

6)依赖范围对传递依赖的影响

传递依赖是会受到依赖范围的影响的,具体来看结果如下:

 

 7)依赖阻断

例如在HelloFriend项目里面的Hello依赖处添加该配置

则makeFriend项目里面就不会再引入Hello的依赖

8)可选依赖

如果我们需要在依赖中明确的排除掉某一依赖,则可以使用exclusion属性,排除掉引用的依赖,如图:

 

6.仓库

 1)仓库的概念

在 Maven 的术语中,仓库是一个位置(place)。

Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。

在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。

Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。

仓库的类型有:

  • 本地(local)
  • 中央(central)
  • 远程(remote)

 2)本地仓库

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

运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。

默认情况下,不管Linux还是 Windows,每个用户在自己的用户目录下都有一个路径名为 .m2/respository/ 的仓库目录

Maven 本地仓库默认被创建在 %USER_HOME% 目录下。要修改默认位置,在 %Maven_HOME%\conf 目录中的 Maven 的 settings.xml 文件中定义另一个路径。

 

3)中央仓库

Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。

中央仓库包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载到。

中央仓库的关键概念:

  • 这个仓库由 Maven 社区管理。
  • 不需要配置。
  • 需要通过网络才能访问。

 

7.生命周期

1)生命周期的概念

Maven的生命周期是对所有的构建过程进行抽象和统一。Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,生命周期只是定义了一系列的阶段,并确定这些阶段的执行顺序。而在执行这些阶段时,实际的工作还是由插件来完成的。这种思想与设计模式中的模板方法非常相似。

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

  • Clean
      • clean生命周期的目的是清理项目
  • Default
      • default生命周期的目的是构建项目
  • site

site生命周期的目的是建立项目站点。

2)完整的生命周期

 

用户在mvn命令后可以指定三个生命周期中的任何阶段,则Maven会按以下逻辑执行:首先会得到该阶段所属生命周期,从该生命周期中的第一个阶段开始按顺序执行,直至该阶段本身。例如执行mvn clean命令会依次执行clean生命周期中的pre-clean阶段及clean阶段。mvn命令后可以指定多个阶段,Maven会按照输入的顺序依次执行,每次执行都会按照之前描述的逻辑执行。

之前提到实际的工作还是由插件来完成的,这意味着插件需要和阶段绑定起来。Maven已经事先将很多核心插件绑定到对应的阶段,这样用户几乎不用配置就有构建Maven项目。Maven的内置绑定如下:

 

8.maven的继承和聚合

 1)继承的意义

继承就是避免重复,maven的继承也是这样,它还有一个好处就是让项目更加安全。比如我们在项目开发的过程中,可能多个模块独立开发,但是多个模块可能依赖相同的公共模块,比如说每个模块都需要javaseo-utils,在编译的时候,maven-compiler-plugin插件也要被引入,maven仓库地址以及发布目录都是相同的配置。我们可以使用Maven的继承功能,把公共的配置信息写到父模块中,子模块只要继承了该父模块,也会继承父模块的配置信息。

2)可继承的pom元素

groupId :项目组 ID ,项目坐标的核心元素;

version :项目版本,项目坐标的核心元素;

description :项目的描述信息;

organization :项目的组织信息;

inceptionYear :项目的创始年份;

url :项目的 url 地址

develoers :项目的开发者信息;

contributors :项目的贡献者信息;

distributionManagerment :项目的部署信息;

issueManagement :缺陷跟踪系统信息;

ciManagement :项目的持续继承信息;

scm :项目的版本控制信息;

mailingListserv :项目的邮件列表信息;

properties :自定义的 Maven 属性;

dependencies :项目的依赖配置;

dependencyManagement :醒目的依赖管理配置;

repositories :项目的仓库配置;

build :包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等;

reporting :包括项目的报告输出目录配置、报告插件配置等。

3)idea实现maven的继承

(1)创建父类项目

 

创建子类项目core

 

 

以同样的方式创建manage和portal项目:

 

至此,一个由parent统一管理core,manage和portal的mavan项目就创建好了;

观察父子项目的pom文件配置

 

 

4)继承的依赖管理

父类直接引用依赖,如果在父类的dependencies内直接引用依赖,则子类都会继承该依赖,以mybatis为例:

 

父类通过dependencyManagement管理依赖,子类不会默认继承该依赖,但是当子类使用该依赖时无需考虑版本信息,直接继承父类dependencyManagement中设置的版本号(Version),以log4j为例:

 

 

5)聚合管理

我们在平时的开发中,项目往往会被划分为好几个模块,比如common公共模块、system系统模块、log日志模块、reports统计模块、monitor监控模块等等。这时我们肯定会出现这么一个需要,我们需要一次构件多个模块,而不用每个模块都去mvn;

以上面得父子项目为例,当我们对parent进行mvn install时,会对core,manage和portal项目均进行install操作:

 

6)​​​​​​​properties属性的使用

通过 properties元素用户可以定义一个或多个 maven 属性,然后在 maven 的其他地方使用 ${属性名称} 的方式引用该属性,这种做法的意义在于消除重复和统一管理。比如,需要在多个地方重复声明同样的 SpringFramework 版本,现在只需要在一个地方声明就可以。

 

相关文章:

  • 《2025全球机器学习技术大会:阿里云讲师张玉明深度剖析通义灵码AI程序员》
  • 时间复杂度和空间复杂度 [数据结构 初阶]
  • Go语言--语法基础4--基本数据类型--字符串类型
  • MCU ADC参考电压变化怎么办?
  • 宝马中国再度深化AI布局,宣布正式接入DeepSeek技术
  • 【创新实训个人博客】数据库搭建
  • AOSP Android14 Launcher3——Launcher的状态介绍LauncherState类
  • 重合闸的作用与技术解析
  • Server-Side Request Forgery服务器端请求伪造(ssrf)
  • PDFMathTranslate:让数学公式在PDF翻译中不再痛苦
  • PDF嵌入图片
  • 新闻数据接口开发指南:从多源聚合到NLP摘要生成
  • Linux的例行性工作(crontab)
  • 自动驾驶(ADAS)领域常用数据集介绍
  • Windows 安装 Yarn 的教程
  • 4.2.2 MySQL索引原理以及SQL优化
  • LangChain构建大模型应用之RAG
  • java-mybatis01
  • 大模型时代的具身智能:从虚拟到现实的智能体进化革命
  • 用Python做有趣的AI项目 2:用 Python 和 NLTK 构建一个聊天机器人
  • 2025上海浪琴环球马术冠军赛开赛在即,首批赛马今晨抵沪
  • 永辉超市一季度净利降近八成,未来12个月至18个月是改革成果集中释放期
  • “归雁经济”能带来什么?川大商学院调研团队深入乡村与返乡青年人才交流
  • 审议民营经济促进法草案等,十四届全国人大常委会第十五次会议将举行
  • 朝中社发表评论文章,谴责美军部署B1-B轰炸机至日本
  • 人民日报开新栏,冼星海之女追忆父亲创作《黄河大合唱》