技术笔记:Maven的pom.xml(坐标的gav、依赖的scope)

简介: 技术笔记:Maven的pom.xml(坐标的gav、依赖的scope)

什么是pom.xml


  POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示,名称叫做pom.xml。


作用类似ant的build.xml文件,功能更强大。该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。事实上,在Maven世界中,project可以什么都没有,甚至没有代码,但是必须包含pom.xml文件。


maven的坐标(GAV)


不论是本地仓库,还是中央仓库,都会存在很多的构件,比如jar和war等等的。


在如此众多的构件中,就是通过groupId,artifactId,version,packaging和classifier来唯一标识一个构件,也就是maven坐标.


groupId:定义当前 Maven 项目所属的实际项目,跟 Java 包名类似,通常与域名反向一一对应。


artifactId:定义当前 Maven 项目的一个模块,默认情况下,Maven 生成的jar,其文件名会以 artifactId 开头


version:定义项目版本。


packaging:定义项目打包方式,如 jar,war,pom,zip ……,默认为 jar。


classifier:定义项目的附属构件, hibernate-core-3.6.6.Final-sources.jar,hibernate-core-3.6.6.Final-javadoc.jar,其中 sources 和 javadoc 就是这两个附属构件的 classifier。classifier 不能直接定义,通常由附加的插件帮助生成.


所有的依赖都是通过坐标来进行管理的(GAV—>groupId,artifactId,version) 通过设置依赖



[/span>packaging


[/span>dependency

[/span>groupId

[/span>artifactId

[/span>version


[/span>scope


网上的仓库提供了坐标的查询:


  mvnrepository :http://mvnrepository.com/ (输入要导入依赖的关键字,复制它的gav)网址记不到?直接百度maven,第一个就是了


  Maven是如何搜索依赖的?首先会在本地仓库查询,如果本地仓库没有,就去中央仓库查询。


maven的依赖(scope)


  maven项目构建的过程


依赖范围就是用来控制依赖与这三种classpath(编译classpath、测试classpath、运行classpath)的关系,Maven有以下几种依赖范围。


  1. compile: 编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的maven依赖,对于编译 测试 运行三种的classpath都有效。


  2. test:测试依赖范围。使用此依赖范围的Maven依赖,只对于测试的classpath有效,在编译主代码或者运行主代码的时候都无法依赖此类依赖。典型的例子是jUnit,它只有在编译测试代码及运行测试代码的时候才有效。


  3. provided:以提供依赖范围。使用此依赖范围的maven依赖,对于编译和测试classpath有效,但在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行的时候,由于容器已经提供,就不需要maven重复地引入一遍。打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是打包阶段做了exclude操作


  4. runtime:运行时依赖范围。使用此依赖范围的maven依赖,对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC驱动实现,项目主代码的编译只需要jdk提供的jdbc的接口,只有在执行测试或者运行测试的时候才需要实现上述接口的jdbc的驱动


  5. system:系统依赖范围。从参与度来说,和provided相同,不过被依赖项不会从maven仓库下载,而是从本地文件系统拿。需要添加systemPath的属性来定义路径,该依赖与三种范围的classpath


和provided依赖范围完全一致。可能造成不可移植,谨慎使用。


  6.import:导入依赖范围。该依赖范围不会对三种classpath产生实际的影响。只有在dependencyManagement下才有效果。


测试总结:


默认引入 的 jar 包 ------- compile 【默认范围 可以不写】(编译、测试、运行 都有效 )


servlet-api 、jsp-api ------- provided (编译、测试 有效, 运行时无效 防止和 tomcat 下 jar 冲突)


jdbc 驱动 jar 包 ---- runtime (测试、运行 有效 )


junit ----- test (测试有效)


依赖范围由强到弱的顺序是:compile>provided>runtime>test


如果没有写scope 默认的依赖的范围是:compile


依赖会被传递


  当我A模块依赖于B模块,而B模块依赖于C模块,那么A模块也就间接的依赖于C模块,


这种依赖主要是基于complie范围(编译范围)的依赖.但是对于scope是test,那不会进行依赖的传递. 


  有的时候为了避免这种间接的依赖,我们可以使用来排除依赖.


例如:在导入javax.servlet-api 3.0中,在导入jsp-api (附带导入了serclet-api),可能会出现jar包冲突


[/span>dependency

[/span>groupId

[/span>artifactId

[/span>version

[/span>scope


[/span>dependency

[/span>groupId

[/span>artifactId

[/span>version

[/span>scope


[/span>exclusions

[/span>exclusion

[/span>groupId

[/span>artifactId




如果直接与间接依赖中包含有同一个坐标不同版本的资源依赖,以直接依赖的版本为准(就近原则)


如果直接依赖中包含有同一个坐标不同版本的资源依赖,以配置顺序下方的版本为准(就近原则)


依赖归类(定义版本变量)


  通常在项目中,我们会同时依赖同一个构件的不同模块,如 spring-orm-3.2.0,spring-context-3.2.0,且多个模块版本相同,为了维护和升级方便,我们可以对其同一管理,这时可以使用到 Maven 属性,类似于变量的概念。


[/span>properties

style="color: rgba(0, 0, 255, 1)"]//变量名随便定义

3.2.0.RELEASE



[/span>dependencies

[/span>dependency

[/span>groupId

[/span>artifactId

[/span>version


[/span>dependency

[/span>groupId

[/span>artifactId

[/span>version


相关文章
|
2月前
|
前端开发 JavaScript Java
Java构建工具-maven的复习笔记【适用于复习】
这篇文档由「潜意识Java」创作,主要介绍Maven的相关知识。内容涵盖Maven的基本概念、作用、项目导入步骤、依赖管理(包括依赖配置、代码示例、总结)、依赖传递、依赖范围以及依赖的生命周期等七个方面。作者擅长前端开发,秉持“得之坦然,失之淡然”的座右铭。期待您的点赞、关注和收藏,这将是作者持续创作的动力! [个人主页](https://blog.csdn.net/weixin_73355603?spm=1000.2115.3001.5343)
44 3
|
4月前
|
Java Maven
maven项目的pom.xml文件常用标签使用介绍
第四届人文,智慧教育与服务管理国际学术会议(HWESM 2025) 2025 4th International Conference on Humanities, Wisdom Education and Service Management
353 8
|
6月前
|
Java 数据库连接 Maven
【Java笔记+踩坑】Maven高级
分模块开发、依赖传递与冲突问题、 可选依赖和排除依赖、聚合和继承、属性、多环境配置与应用、私服安装和使用
【Java笔记+踩坑】Maven高级
|
7月前
|
Java Maven
解决idea每次新建maven项目都需要重新配置maven的问题
解决idea每次新建maven项目都需要重新配置maven的问题
267 1
|
4月前
|
XML Java 测试技术
从零开始学 Maven:简化 Java 项目的构建与管理
Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。
119 1
从零开始学 Maven:简化 Java 项目的构建与管理
|
4月前
|
Java 应用服务中间件 Maven
Maven的三种项目打包方式——pom,jar,war的区别
Maven 提供了多种打包方式,分别适用于不同类型的项目。pom 用于父项目或聚合项目,便于项目的结构和依赖管理;jar 用于Java类库或可执行的Java应用程序;war 则专用于Java Web应用程序的部署。理解这些打包方式的用途和特点,可以帮助开发者更好地配置和管理Maven项目,确保构建和部署过程的顺利进行。无论是单模块项目还是多模块项目,选择合适的打包方式对于项目的成功至关重要。
448 3
|
5月前
|
Java 关系型数据库 MySQL
Maven——创建 Spring Boot项目
Maven 是一个项目管理工具,通过配置 `pom.xml` 文件自动获取所需的 jar 包,简化了项目的构建和管理过程。其核心功能包括项目构建和依赖管理,支持创建、编译、测试、打包和发布项目。Maven 仓库分为本地仓库和远程仓库,远程仓库包括中央仓库、私服和其他公共库。此外,文档还介绍了如何创建第一个 SpringBoot 项目并实现简单的 HTTP 请求响应。
367 1
Maven——创建 Spring Boot项目
|
5月前
|
Java 关系型数据库 MySQL
如何使用 maven 创建一个 Spring Boot项目
Maven 是一个强大的项目管理工具,通过配置 `pom.xml` 文件自动获取所需的 jar 包,提高开发效率。其核心功能包括项目构建和依赖管理。项目构建支持编译、测试、打包和发布等流程,而依赖管理则通过中央仓库、本地仓库和私有服务器获取和管理项目依赖。示例中展示了如何创建第一个 SpringBoot 项目并实现简单接口。
97 1
如何使用 maven 创建一个 Spring Boot项目
|
5月前
|
Java Maven Kotlin
idea maven创建kotlin项目
本文介绍了在IntelliJ IDEA中使用Maven创建Kotlin项目的步骤,包括在`pom.xml`文件中添加Maven中央仓库、配置`kotlin-maven-plugin`插件、指定源目录、添加测试插件和执行插件,以及添加Kotlin测试依赖和标准库依赖。文中还提到了如何通过更换镜像或使用代理来解决依赖下载速度慢的问题,并展示了运行示例代码的截图。
282 4
idea maven创建kotlin项目

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等