`

maven学习之坐标和依赖

 
阅读更多
   在maven的世界里,每一个构件都是由maven坐标唯一标识的,通过这个坐标就可以找到该构件(artifact),当构建项目的时候,例如打包或者install的时候,就会根据该坐标找到该artifact并且下载该artifact。
    maven坐标类似于平面几何(x,y),或者立体几何中的(x,y,z),唯一标识一个artifact(构件),可以是jar包,或者是war文件,通常是jar。Maven坐标包括的元素包括groupId,artifactId,version,packing,classifier几个元素,packing默认是jar,当然在聚合项目中,必须是pom,为了复用一些信息,而建造的“父项目”的packing也为pom。Classifier元素可选的,定义了构件输出的一些附属属性,例如主构件是nexus-indexer-2.0.0.jar,该项目可能还通过一些其他插件生成其他附属构件,例如javadoc文档、sources源代码,nexus-indexer-2.0.0-javadoc.jar、nexus-indexer-2.0.0-sources.jar,这里的javadoc和sources就是classifier。groupId,artifactId,version是必须定义的,packing是可选的,默认为jar,classifier是不能直接定义的。同时项目构件的文件名是与坐标相对应的,一般的规则为artifactId-version-[classifier].packing。
    典型的maven依赖如下:
<project>
     …………
      <dependencies>
       <dependency>
         <groupId>…</groupId>
         <artifactId>…</artifactId>
         <version>…</version>
         <type>…</type>
         <scope>…</scope>
         <option>…</option>
         <exclusions>
            <exclusion>
            ……
              </exclusion>
         </exclusions>
       <dependency>
       ……
      <dependencies>
     …………
</project>
groupid、artifactid和version已经在之前的博文介绍过了,下面介绍下下面的几个
type:依赖的类型,对应于项目坐标定义的packing。通常情况下,该元素不必声明,默认情况下为jar
scope:依赖范围。默认为compile
option:标记依赖是否可选
exclusions:用于排除传递性依赖。排除依赖一般应用于传递依赖的排除。假设A依赖B,B又依赖于C,但是这个C是非稳定版本。那么就排除该不稳定的C的依赖。然后直接依赖一个稳定版本的C。

   依赖范围:控制依赖与三种classpath(编译、测试、运行)的关系
1、complie范围:对于编译,测试,运行三种classpath均有效,例如spring-core.jar
2、Test范围:只对测试classpath有效,例如junit
3、provided范围:又名已提供依赖范围,对于编译和测试classpath有效,最典型的是  servelt-api,在编译和测试的时候需要提供它,但是运行时,一般容器已经提供了servelt-api,所以在运行时classpath不需要此jar。
4、runtime范围:运行时依赖,对于测试和运行classpath有效,最典型的是JDBC驱动实现,在编译的时候,只需要JDBC驱动提供的接口,到了测试和运行的时候,才需要具体实现JDBC接口的驱动。
5、system范围:系统依赖范围,与provided一样,但是使用该依赖范围的依赖必须使用systemPath显示得制指定依赖文件的路径。由于此类依赖不是通过maven仓库解析的,往往与本地系统绑定,造成系统移植性差,所以慎重使用。
6、import依赖:该依赖范围不会对三种classpath产生实质性的影响,主要与dependencyManagement有关。
   传递依赖:以las-im-basis项目为例子。
   

las-im-basis直接以compile范围依赖spring-core,spring-core直接以compile范围依赖commons-logging,所以las-im-basis以compile范围间接依赖commons-logging。
下面的表左边第一列表示第一直接依赖范围,最上面一行表示第二直接依赖范围,中间的交叉表示的是传递依赖范围


下面介绍几个术语
1、依赖调解
A->B->C->X(1.0),A->D->X(2.0),X是A的传递性依赖,但是有两条路径,到底是哪个版本的X会被maven解析呢,maven遵循路径短者优先,所以X(2.0)会被解析。如果这两个路径长度相同呢,则第一声明者优先,也就是依赖在pom的顺序,顺序前者优先。
2、可选依赖
A->B->X(可选),A->B->Y(可选),则X,Y对A的三种classpath不产生什么实际效果,要想X或者Y对A产生作用,需要显示得在A的pom中声明X或者Y的依赖。可选依赖X、Y在B项目中的pom的表示是<option>true</option>,X、Y在B项目中是互斥的,在某一时刻只能有一个在起作用。
    Maven的最佳实践(前人的经验总结)
排除依赖:A->B->C,由于B引用的C为非稳定版本,所以需要排除B依赖的C,在A项目中再依赖一个稳定版本的C,排除依赖用<exclusions>元素。
归类依赖:举例来说如果项目有很多的spring framework的依赖,可以遇见的事这些依赖的版本都是一样的,且以后升级的时候,需要一起升级。这个时候就需要归类了
<project>
……
<properties>
     <springframework.version>2.5.6</springframework.version>
</properties>
    ……
   <dependencies>
<dependency>
   <groupId>…</groupId>
   <artifactId>…</artifactId>
   <version>${springframework.version}</version>
          </dependency>
   </dependencies>
    …….
</project>

   关于优化依赖
   优化依赖。Maven会自动解析所有项目的直接依赖和传递性依赖,并且根据规则确定每个依赖的范围,对于一些依赖冲突,也能进行调节,以确定每个构件只有唯一的版本在依赖中存在,经过上述工作得到的依赖,被成为已解析依赖,在命令行中输入:
mvn dependency:list查看已解析依赖;mvn dependency:tree查看已解析依赖构成的依赖树;mvn dependency:analyze分析已解析的依赖,会得到Used undeclared dependencies列表,但是不能简单将在其中的依赖删掉,因为mvn dependency:analyze只能分析编译主代码和测试代码需要用到的依赖,一些执行测试和运行时需要的依赖就没有办法得到了,所以在Used undeclared dependencies中很有可能有在运行时使用的依赖!例如servlet-api。

   

  • 大小: 15.7 KB
  • 大小: 28.1 KB
分享到:
评论

相关推荐

    Maven介绍安装配置坐标依赖等等

    Maven简介,maven与ant比较,windows下安装配置,坐标依赖,仓库,部署第三方构建

    Maven原理和实践-培训课件.ppt

    何为Maven 构建,依赖管理,项目信息聚合 Maven核心概念 坐标,依赖,仓库,生命周期,插件 Maven最佳实践 创建、打包、发布、版本管理 项目实战 Nexus(Todo…) M2eclipse(Todo…)

    Maven权威指南 很精典的学习教程,比ANT更好用

    Maven坐标 (Coordinates) 3.5.4. Maven仓库(Repositories) 3.5.5. Maven依赖管理 (Dependency Management) 3.5.6. 站点生成和报告 (Site Generation and Reporting) 3.6. 小结 4. 定制一个Maven项目 4.1. ...

    深入理解Maven的坐标与依赖

    主要介绍了深入理解Maven的坐标与依赖,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    jacob-1.18.jar/dll maven

    jacob-1.18的资源包还有 jacob-1.18-x64.dll和jacob-1.18-x86.dll. 把对应的windows版本扔到 C:\Windows\System32 并添加环境变量大到path中 “%SYSTEMROOT%\System32\jacob-1.18-x86.dll;”或者 “%SYSTEMROOT%\...

    三. 坐标和依赖

    NULL 博文链接:https://sgq0085.iteye.com/blog/1860636

    maven课程讲义.doc

    关于maven的学习资料Maven是apache下的开源项目,项目管理工具,管理java项目。 1、项目对象模型 (Project Object Model) POM对象模型,每个maven工程中都有一个pom.xml文件,定义工程所依赖的jar包、本工程的坐标...

    Maven: 仓库搜索服务

    如何输入关键字,寻找需要依赖jar的MAVEN坐标,需要提供确切的MAVEN坐标 1.Sonatype Nexus 地址: https://repository.sonatype.org 2. Jarvana 地址: http://www.jarvana.com/jarvana 3.MVNbrowser 地址: ...

    maven3教程(私塾在线)视频配套学习资料

    3、maven坐标 4、maven命令:重点理解【生命周期和阶段】和【插件和目标】 5、在eclipse中通过m2eclipse插件使用maven 6、配置和使用私服 7、实战maven,把以前一个不是用maven做的模块,移植为maven项目 这是...

    Maven入门巨无霸视频教程(2.24G)

    使用Maven核心概念介绍(坐标、依赖、仓库、插件、...任亮系列-maven坐标.mp41010.任亮系列-maven依赖介绍.mp41111.任亮系列-maven依赖范围.mp41212.任亮系列-maven依赖传递和可选依赖和排除依赖.mp41313.任亮系列-mav

    maven window下安装包

    第5章:坐标和依赖/5.9 最佳实践/5.9.2 依赖属性使用变量 第5章:坐标和依赖/5.9 最佳实践/5.9.3 依赖关系查看 第6章:仓库/6.1 何为Maven仓库 第6章:仓库/6.2 仓库的布局 第6章:仓库/6.3 仓库的分类 第6章:仓库/...

    尚硅谷Java视频教程_Maven视频

    第一个Maven工程的目录结构和文件内容 · 10.联网问题 · 11.几个常用Maven命令 · 12.POM · 13.坐标 · 14.仓库 · 15.第二个Maven工程的目录结构和文件内容 · 16.依赖的基本操作 · 17.依赖的范围初步...

    Maven仓库 版本为3.8.8

    在Maven中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。 Maven在某个统一的位置存储所有项目的共享的构件,这个统一的位置,我们就称之为仓库。(仓库就是存放依赖和插件的地方) 任何的构件都有唯一...

    Maven学习精华教程-电子书

    此文件为exe格式电子书,无需安装任何阅读软件就可以打开,由mybase笔记软件生成。 此电子书详细介绍了项目自动化构建...坐标和依赖 聚合与继承 插件_概念与使用 插件_常用插件列表 仓库_概念与配置 仓库_私服_Nexus

    Maven介绍安装和配置详解

    2. **依赖管理**:Maven可以自动管理项目的依赖项,开发者只需要在pom.xml文件中指定依赖项的坐标,Maven就会自动下载并管理这些依赖项。 3. **自动化构建**:通过简单的命令行指令,Maven可以自动化地完成编译、...

    apache-maven-3.6.3.rar

    用Maven来管理jar包,帮我们处理以上所有流程. 1.仓库 远程仓库/中央仓库: 本质上就是一个 国外的 网址 镜像仓库: 本质上就是一个 国内的 网址,网站上存了去中央仓库下载好的jar包,常用的是阿里云 本地仓库: 就是你...

    maven笔记.docx

    Maven是一个强大的项目构建工具和依赖管理工具,用于简化和自动化Java项目的构建、发布和管理过程。它具有集中式的项目描述文件,可以帮助开发人员更轻松地管理项目的依赖、构建过程和发布版本。以下是对Maven的描述...

    Maven是一个项目管理工具,它包含了一个对象模型 一组标准集合,一个依赖管理系统 和用来运行定义在生命周期阶段中插件目标和逻辑

    Maven的核心功能是合理叙述项目间的依赖关系,通俗点 就是通过pom.xml文件的配置获取jar包不用手动的去添加jar包,,这个pom.xml包我后面会叙述,不过已经学习过maven的 人应该对这个很熟悉。其本质就是通过配置pom....

    Maven实战(高清版)

    背景案例第5章 坐标和依赖第6章 仓库第7章 生命周期和插件第8章 聚合与继承第9章 使用nexus创建私服第10章 使用maven进行测试第11章 使用hudson进行持续集成第12章 使用maven构建web应用第13章 版本管理第...

    Maven面试题及其答案

    Maven的核心概念包括POM、坐标、仓库、生命周期、插件、依赖管理。 3、什么是POM? POM是Maven项目的核心文件,它是Project Object Model(项目对象模型)的缩写。POM以XML格式编写,POM文件包含了项目的基本信息; ...

Global site tag (gtag.js) - Google Analytics