Maven学习笔记(三)——坐标和依赖

参考书籍Maven实战:可在InfoQ的Minibook出下载相关电子版。


一、坐标

 

maven坐标为各种构件引入了秩序,任何一个构件都必须明确定义自己的坐标,而一组maven坐标是通过一些元素定义的,它们是groupId,artifactId,version,packaging,chassifier。先看一组坐标定义,如下:

 

 

<groupId>org.sonatype.nexus</groupId> <artifactId>nexus-indexer</artifactId> <version>2.0.0</version> <packaging>jar</packaging>

 

 

下面详细解释一下各个坐标元素:

1.groupId: 定义当前maven项目隶属的实际项目。首先,maven项目和实际项目不一定是一对一的关系。比如SpringFramework这一实际项目,其对应的maven项目会有很多,如: spring-core,spring-context等。这是由于maven中模块的概念,因此,一个实际项目往往会被划分成很多模块。其次,groupId不应该对应项目隶属的组织或公司。原因很简单,一个组织下会有很多个实际项目,如果groupId只定义到组织级别,而后面我们会看到,artifactId只能定义maven项目(模块),那么实际项目这个层将难以定义。最后,groupId的表示方式与java包名的表示方式类似,通常与域名反向一一对应。

 

2.artifactId: 该元素定义实际项目中的一个maven项目(模块),推荐的做法是使用实际项目名称作为artifactId前缀,这样做的好处是方便寻找实际构件。在默认情况下,maven生成的构件,其文件名会以artifactId作为开头,如:nexus-indexer-2.0.0.jar,使用实际项目名称作为前缀之后,就能方便从一个lib文件夹中找到某个项目的一组构件。

 

3.version: 该元素定义maven项目当前所处的版本,如:nexus-indexer-2.0.0.jar的版本是2.0.0。需要注意的是,maven定义了一套完整的版本规范,以及快照(SNAPSHOT)的概念。

 

4.packaging: 该元素定义maven项目的打包方式。首先,打包方式通常与所生成构件的文件扩展名对应,如:nexus-indexer.2.0.0.jar的packaging为jar,而使用war打包方式的maven项目,最终生成的构件会有一个.war文件,不过这不是绝对的。其次,打包方式会影响到构建的生命周期,比如jar打包和war打包会使用不同的命令。最后,当不定义packaging的时候,maven会使用默认值jar。

 

5.classifier: 该元素用来帮助定义构建输出的一些附属构件。附属构件与主构件对应,如上例中的主构件是: nexus-indexer-2.0.0.jar,该项目可能还会通过使用一些插件生成如:nexus-indexer-2.0.0-javadoc.jar、nexus-indexer-2.0.0-sources.jar这样一些附属构件,其包含了java文档和源代码。这时候,javadoc和sources就是这两个附属构件的classifier。这样,附属构件也就拥有了自己唯一的坐标。

注意:不能直接定义项目的classifier,因为附属构件不是项目直接默认生成的,而是由附加的插件帮助生成。

 

上述5个元素中,groupId,artifactId,version是必须定义的,packaging是可选的(默认为jar),而classifier是不能直接定义的。

 

同时,项目构件的文件名是与坐标相对应的,一般的规则为:artifactId-version[-classifier].packaging,[-classifier]表示可选。

二、依赖

 

  1. 依赖与依赖的配置

    顾名思义,依赖就是当用到其他模块作为为其服务时而产生的一种关系,通过其坐标找到其对应模块。进而引出有关依赖的配置,如下是一个很常见的POM配置

     

    <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.5</version> <type>jar</type> <scope>test</scope> </dependency> </dependencies>

     

    • groupId,artifactId和version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,maven根据坐标才能找到需要的依赖。
    • type:依赖的类型,对于项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值为jar。
    • scope:依赖的范围。
    • optional:标记依赖是否可选。
    • exclusions:用来排除传递性依赖。
  2. 依赖范围

    举例来说,你开发时需要做测试,你需要依赖于junit的jar,但是部署应用时并不需要它,因为单元测试不会在生产环境上跑,也就是说最终打包的jar或者war不包含junit的jar。又如你开发web程序,你的servlet/jsp进行编译需要依赖于servlet-jsp的标准api(J2EE的jar),但是部署时也是不需要它的,因为你的应用服务器肯定有这些东西。

    因此,Maven考虑了6中可能的scope供选择:

    - compile: 默认的scope。编译、测试、打包全都需要。compile参与依赖传递,就是说,你的项目A依赖于B(依赖scope是compile),项目C依赖于你的项目A,那么C也就依赖于B。

    - provided: 表示JDK或者容器会在Runtime时提供这些(jar),如上面说到的servlet api。provided的东西在编译和测试时会用到,不参与传递依赖。

    - runtime: 表示编译时不需要,但测试和运行时需要,最终打包时会包含进去。

    - test: 只用于测试阶段(测试的编译和测试的运行),典型的就是junit的jar。

    - system: 和provided类似,但要求jar是你的系统里已有的,不会在repository里找,如rt.jar,tools.jar这些。

    - import: 简单的说,你的项目的pom可以继承另一个项目的pom,从而继承了父项目的依赖关系,但是因为之后single inheritance的限制,所以创造了import,使得你可以“导入”或者说“继承”任何一到多个项目的依赖关系。

    如果你要考虑更细一些,你的项目依赖于A(scope1),A依赖于B(scope2),那么你的项目对B的依赖应该算是哪个scope呢?官方文档上有个表格,列举了scope1和scope2的一个矩阵关系(各自都可能是compile/provided/runtime/test),然后最后结果应该是什么。


  3. 依赖的传递性
    传递性依赖:account-mail有一个compile范围的spring-core依赖,spring-core有一个compile范围的commons-logging依赖,那么commons-logging就会成为account-mail的compile范围依赖。
  4. 依赖调解
    maven引入的传递性依赖机制,一方面大大简化和方便了依赖声明,另一方面大部分情况下我们只需要关心项目直接依赖的是什么,而不用考虑这些依赖会引入什么传递性依赖。但有时候,当传递依赖造成问题的时候,我们需要清楚地知道该传递性依赖是从哪条依赖路径引入的。
    maven依赖调解的两个原则。(1)第一原则是:路径最近者优先。(2)第二原则是:第一声明者优先。在依赖路径长度相等的前提下,在pom依赖声明的顺序决定了谁会解析使用,顺序最靠前的那个依赖优胜。
  5. 可选依赖

    假设有这样一个依赖关系,项目A依赖于项目B,项目B依赖于项目X和Y,B对于X和Y的依赖都是可选依赖:A-->B,B-->X(可选),B-->Y(可选)。根据传递性依赖的定义,如果所有这三个依赖的范围都是compile,那么X,Y就是A的compile范围传递性依赖。然而,由于这里X,Y是可选依赖,依赖将不会得以传递。换句话说,X,Y将不会对A有任何影响。

    为什么要使用可选依赖这一特性呢?可能项目B实现了两个特性,其中的特性一依赖于X,特性二依赖于Y,而且这两个特性是互斥的,用户不可能同时使用两个特性。比如B是一个持久层隔离工具包,它支持多种数据库,包括MySQL,PostgreSQL等,在构建这个工具包的时候,需要这两种数据库的驱动程序,但在使用这个工具包的时候,只会依赖一个数据库。


 

maven in action(四)maven坐标和依赖 坐标(coordinate) 数学课本中的坐标,在平面中的坐标(x,y)能标明平面中的一点,(x,y,z)能找到空间立体中的一点。根据你的身份证地址能找到这个世界上独一无二的你。而在maven中,世界上任何一个构建(jar或者war)都能用maven坐标唯一标识,maven坐标包括groupId、artifactId、version、packaging、classifier。我们提供正确的坐标元 阅读详情

相关推荐

Maven 依赖坐标与BOM统一管理

GroupId:采用逆向域名规则,体现组织或项目归属<!-- 示例:Apache Commons项目 --> < groupId > org.apache.commons </ groupId >-- 示例:Apache Commons项目 --> < groupId > org.apache.commons </ groupId ></-- 示例:Apache Commons项目 --> < groupId > org.apache.commons </ groupId >ArtifactId。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 2895

Maven的GroupID和ArtifactID含义

groupId一般是域名的反写,也作为项目中类的包名, artifactId是工程名,也就是根文件夹名. groupId :the unique identifier of the organization or group that created the project artifactId :unique base name of the primary artifact being...

zl325118的博客 2263

OpenCV函数用法之calibrateCamera

参考链接:opencv中标定函数calibrateCamera_ychl87的专栏-优快云博客 世界坐标系的三维点投影到成像坐标系中的二维点的投影公式如下: 其中(X,Y,Z)为世界坐标系中的三维点; (u,v)为成像面坐标系中的二维点; A为相机的内参数矩阵:(cx,cy)为主光轴点,一般为图像的中心;fx和fy为焦距; [R|t]为相机的外参数矩阵:R为旋转矩阵,t为位移矩阵; 上述公式的简单推理过程如下 考虑到镜头畸变 其中,k1,k2,k3,k4,k5和k6为径向畸变,p1和.

tiger&sheep的博客 3万+

【maven】什么是坐标(依赖)继承与模块、web项目启动&访问

maven基础之什么是坐标(依赖)、什么是坐标(依赖)、web项目启动&访问、jar项目转war项目

少年你真的要止步于此嘛。 1886

Greenplum基础

CREATE DATABASE 是 SQL 命令,用于创建一个新的数据库。name 是你要创建的数据库的名称。这个名称是必须的,并且在同一个数据库服务器上必须是唯一的。可选项,OWNER 指定了新数据库的所有者,如果未指定,新数据库的所有者默认是执行该命令的用户。dbowner 是数据库所有者的用户名。可选项,TEMPLATE 指定了用于创建新数据库的模板。在 PostgreSQL 和 GreenPlum 中,通常有一个名为 template1 的默认模板。如果不指定,就会使用这个默认模板。

m0_57697768的博客 1206

SuperPoint + LightGlue实战:低纹理墙面重建保姆级教程(附完整代码)

本文提供了一份针对低纹理墙面三维重建的实战教程。通过详细解析SuperPoint与LightGlue的核心参数调优,指导读者如何有效提取并匹配低纹理目标的特征点,并结合COLMAP完成从稀疏到稠密的重建流程,最终实现高精度建模。

weixin_29034963的博客 223

【Maven教程】(四)坐标与依赖:坐标概念,依赖配置、范围、传递性和最佳实践 ~

关于坐标 (Coordinate), 大家最熟悉的定义应该来自于平面几何。在一个平面坐标系中,坐标 (x,y) 表示该平面上与x 轴距离为y, 与 y 轴距离为x 的一点,任何一个坐标都能够唯一标识该平面中的一点。在实际生活中,我们也可以将地址看成是一种坐标。省、市、区、街道等一系列信息 同样可以唯一标识城市中的任一居住地址和工作地址。邮局和快递公司正是基于这样一种 坐标进行日常工作的。

Technology changes the world of life 4076

高通 Gen AI 推理扩展 (GENIE)(5):实战指南与Engine API深度解析

本文深入解析高通Gen AI推理扩展(GENIE)的Engine API核心功能与实战应用,涵盖引擎实例化、多引擎动态切换、性能调优及跨平台部署等关键技巧。通过详细代码示例和性能数据,帮助开发者高效利用GENIE进行AI推理,提升应用性能与稳定性。

weixin_29065959的博客 465

依赖坐标

进入网站https://mvnrepository.com/ mysql和mybaits依赖坐标: <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> ...

lhelloworld的博客 746

OpenClaw 2026.3.13 踩坑实录:飞书HTTP协议降级Bug与多版本回归问题汇总

摘要:OpenClaw v2026.3.13存在多个严重回归问题,包括飞书API调用协议意外降级为HTTP导致连接失败(#46100)、本地Gateway诊断矛盾(#45504)及设备配对CLI命令失效等。该版本发布流程本身也存在异常,被迫以v2026.3.13-1标签重新发布。建议飞书用户回退至v2026.3.8稳定版,其他用户谨慎升级。本文详细记录了各Bug现象、影响范围及临时解决方案,并梳理了飞书通道的"多版本回归史",指出其根源在于架构变迁和测试覆盖不足。最后提供了包含配置备份、

Maynor的博客 869

企业微信开发007_域名主体校验未通过,需配置备案主体与当前企业主体相同或有关联关系的域名_企业内部自建应用开发_配置可信域名_回调URL_可信IP---企业微信开发009

因为我这个企业微信是,已经注册了服务商了,所以我又注册了一个不是服务商的测试企业,没有实名认证的,去试了试。而且,网络上找的教程,都是不够详细的,还是会碰到各种各样的问题,记录下来,为后来者提供便利。首先我用natapp.cn 申请了一个免费的域名,然后去,一个,企业微信上去配置,注意。我这个域名,的主体,可能是域名服务商,比如阿里域名 等等的 不是一般的企业域名。我这个企业微信,是开通了服务商的,企业微信,右上角有服务商管理后台的。到时候,直接用,他们自己企业注册的域名,已经备案的再去尝试,

添柴程序猿的专栏 1697

坐标和依赖

1.坐标详解:     Maven坐标为各种构件引入了秩序,任何一个构件都必须明确定义自己的坐标,而一组Maven坐标通过一些元素定义的。如:groupId,artifactId,version,packaging,classifier等。 例子:     org.sonatype.nexus  // 定义Maven项目隶属的是实际项目     nexus-indexer

JAVA浩如烟海 716

MFC Windows 程序设计[122]之树形下拉列表框(附源码)

MFC是微软公司提供的一个类库(class libraries),用以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。有很多初学MFC的小伙伴们都觉得MFC比较难学,看书吧,看了就忘了,网上的一些教程又是写的含糊不清,故而学习起来很吃力...... 故此,本专栏亲自研究,实践,由易到难,层层深入,将调试过程中所遭所遇进行详细讲解,注意事项进行一一列举,希望能够帮助到各位初学MFC的小伙伴,避免走弯路,费时费力。.........

hnjzfwy的博客 458

Maven——坐标和依赖

Maven坐标详解、Maven依赖详解、Maven配置技巧

码说芯语的博客 2204

2025.06.06【Ribo-seq】|RiboCode:基于Ribo-seq数据的全基因组翻译ORF检测工具详解与实战流程

大家好!今天我们要学习的是RiboCode——一个专为Ribo-seq(核糖体足迹测序)数据设计的高质量翻译ORF(开放阅读框)检测工具。RiboCode能够帮助我们在全基因组范围内精准识别翻译事件,发掘经典CDS之外的uORF、dORF、重叠ORF等新型翻译本,极大拓展了我们对转录本翻译潜能的认知。RiboCode 是由清华大学杨学睿课题组开发的开源软件,支持Linux/Mac平台,采用Python实现。自动化流程:一条命令即可完成注释准备、P-site定位、ORF预测。高灵敏度与特异性。

1858

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Maven工具学习使用(三)——坐标和依赖

坐标和依赖

螺旋小蜗的专栏 1391

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Maven进阶——坐标、依赖、仓库

Maven 的本地仓库在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。POM( Project Object Model,项目对象模型 ) 定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。对于更大的项目,我们可能需要创建自己的库并在不同的部分使用它的项目。依赖阻断表示,当HelloFriend被其他项目依赖时,不传递Hello的依赖至依赖于HelloFriend的项目。

m0_62909831的博客 1688

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

maven的坐标和依赖

来自《Maven实战》第五章 Maven的一大功能是管理项目, 为了能自动化的解析任何一个java构件, Maven必须将它们唯一标识,这就是依赖管理的底层基础–坐标. 坐标为构件引入秩序 关于坐标最熟悉的应该是平面几何, 在平面几何坐标系中, 坐标(x,y)能够唯一标识平面中的一个点. 实际生活中, 地址也是一种坐标, 通过省市县区街道等一系列的信息,可以唯一标示城市中的任意地址, 邮局和快............

daihaoxin的专栏 1046

Maven的坐标以及依赖

Maven的坐标以及依赖传递

qq_63126439的博客 1409

Maven(三)坐标与依赖

Maven的一大功能就是管理项目依赖,为了能自动化地解析任何一个Java构件,Maven就必须将它们唯一标识,这就是依赖管理的底层基础--坐标。下面我们就详细介绍一下Maven里的坐标。        这里的坐标,显示方式和大家熟悉的平面几何中的坐标(x,y)不一样,但是含义是一致的,这也说明了没有新知识,只有不同知识间的相互转化。可以说,任何一个坐标,不管是平面几何中,也可以是一个地址,都是

孙端 1700

maven详解之坐标与依赖

maven坐标和依赖详解, maven依赖的调优技术 maven依赖配置的最佳实践 maven配置的常见问题的解决方案

Dragon's Life 2万+

Maven教程-坐标和依赖

Maven教程

Ricky 2566

mysql 的maven 坐标_maven 依赖和坐标

1、maven 坐标由groupId、artifactId、packaging、version、classifier定义。2、classifier 用来帮助定义构建输出的一些附属构件。如,*javadoc.jar,*sources.jar。不能直接定义项目的classifier。3、maven packaging 包括 jar、war、pom、maven-plugin、ear等。4、依赖标签及其子...

weixin_28820113的博客 3393

Maven 坐标和依赖

Maven坐标和依赖 坐标详解 Maven为各种构建引入了秩序,任何一个构件都必须明确定义自己的坐标,而一组Maven坐标是通过一些元素定义的,它们是groupId、artifactId、version、packaging、classifier。 <groupId>org.sonatype.nexus</groupId> <artifactId>nexus-indexer</artifactId> <version>2.0.0&l

shi_zi_183的博客 864
上一篇: Maven学习笔记(二)——Eclipse插件安装(m2eclipse)
下一篇: Maven学习笔记(三)——坐标和依赖
G_beginner
博客等级 码龄16年 45粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值