Maven的依存句法分析-研发项目管理

>>Maven的依存句法分析-研发项目管理

Maven的依存句法分析-研发项目管理

引言:当今社会市场竞争激烈,软件开发企业想要占据前列需要在研发管理上下功夫,“向管理要效益”已经成为软件开发企业的共识,研发项目管理在软件企业中的普及也是大势所趋。国内做软件项目管理工具的开发商翼发云近几年发展十分迅速,越来越多的软件开发企业认识到研发项目管理的重要性,能切实有效降低成本,规范软件开发流程,提高软件产品质量。国内研发项目管理系统、敏捷开发管理工具的领导品牌翼发云敏捷项目管理系统采用可视化业务流程技术,支持瀑布模型等传统软件研发项目管理,同时也支持scrum等敏捷开发流程,是理想的敏捷开发管理工具,涵盖软件项目管理工作的整个生命周期。为提高国内软件开发企业的项目管理水平,分享一篇企业管理相关的知识文章。

本文将记录Maven工程中依赖解析机制,内容包括:

  1. Maven依赖的基本结构
  2. 从仓库解析依赖性的机制
  3. 依赖传递实例解析

1。Maven依赖的基本结构

上篇文章记录了Maven依赖的聚合与继承,POM中依赖的声明通过dependency进行定义,并且通过groupId、artifactId及version三项定位Maven库中的唯一依赖。除了这三项外,还有其他属性进行限制,如下: scrum

1 & lt;依赖& gt 2;& lt 3;依赖><GroupID ></ GroupID >4…<artifactId ></ artifactId >5…6版本…<类型></类型>7…和范围;…LT;8和LT;可选的;gt;LT;/可选>9…<排除& gt;& lt 10;11排除><GroupID ></ GroupID >12…<artifactId ></ artifactId >13…和;14;15和/ 16;
  • 三项GroupID,artifactId和版本不再叙述。
  • 类型:依赖项类型,它对应于项目坐标的定义,默认值是JAR;
  • 范围:依赖范围,包括编译、测试、运行时、导入、提供、系统;
  • 可选:标签依赖是可选的,也就是说,依赖不是传递的;
  • 排除:传递依赖性

1.1相关范围

  我们知道,Maven工程约定具有固定的目录结构,以便于Maven各插件对工程处理,如编译(compile)插件,会将src/main/java中的类编译到target/classes目录下,则编译对应的classpath即为target/classes。依赖范围就是控制依赖于编译classpath(target/classes)、测试classpath(target/test-classes)和运行classpath(以Web工程为例,WEB-INF/classes)的关系。具体依赖范围的讲述可参考官网文档,在此仅进行稍微总结:

  • 编译:编译依赖的范围内,是有效的编译,测试和运行的路径,默认范围;
  • 测试:测试依赖的范围,只适用于测试路径;
  • 运行:运行时依赖范围测试和运行的路径是有效的,无效的编制,如JDBC的依赖,因为JDK中声明JDBC接口,及具体的实现取决于生产。
  • 进口:进口的依赖,并没有对三类路径产生真正的影响,一般进口依赖的是POM的类型,聚合条件需要申报的包装类型是POM,它可以包含dependencymanagement(见文章),在相关项目的介绍,这个时间不影响;
  • 提供:它提供了依赖的范围,是一种有效的测试和编译类路径,和无效运行。例如,在测试或编译时需要servlet,它是在运行时由容器提供的,因此不需要反复引入它。
  • 系统:该系统是依赖于系统的范围,与所提供的范围一致,需要指定的jar包,显然,这是不使用Maven仓库常见。

1.2依赖性

依赖传递性,举例说明,比如A引用B,B引用C,正常情况下,A也会引用C依赖,即A经过传递间接引用了C(依赖为可选时,需另行处理)。具体不同范围的依赖经过传递后,其依赖范围的变化如下边(从官网扣下来的) 软件项目管理

Maven依赖解析

依赖转移标准敏捷开发流程

  • 路径的最近优先级是从引用的转移链中删除最近的POM依赖关系。
  • 如果路径距离相同,则POM中的声明序列位于前面。

1.3可选的相关性

  可选依赖不被传递。假设项目A依赖于B,B依赖于X和Y,并且X和Y声明为可选,则X和Y对A就不具有传递性了。如果A需要依赖于X或Y,则需要直接引用。

1.4依赖性排斥

  假设项目A依赖于B,B依赖于C(版本为1.0),此时A会传递性依赖于C(1.0)。如果A需要引用C(2.0版本),存在两种情况: 研发项目管理

  (1)A直接引用C(2.0),则可以不对B依赖添加exclusions元素;

  (2)A在引用B的同时,还引用D(D引用C(2.0)),则可以在引用B的时候使用exclusions元素将C(1.0)排除,也可以将D依赖声明在B之前。

2;从仓库解析依赖性的机制

  依赖解析的基本过程:当本地仓库中没有依赖构件,则Maven从远程仓库中下载;当依赖版本为快照版本时,Maven会自动计算最新的快照,并引用。

  背后的依赖解析机制概括如下:

  (1)当依赖的范围为system,则从本机文件系统中解析构件;

  (2)根据依赖坐标计算定位依赖位置后,尝试从本地仓库寻找依赖,若找到,则解析成功;

  (3)若本地仓库没有对应构件,则遍历所有远程仓库,发现后解析下载;

  (4)如果依赖的版本为RELEASE或LATEST,则读取所有远程仓库的元数据groupId/artifactId/version/maven-metadata.xml,与本地元数据合并后,计算出RELEASE或LATEST的真实值,然后基于真实值检查本地仓库和远程仓库,如步骤(2)(3);

  (5)如果依赖的版本为SNAPSHOT,类似的,读取远程仓库的元数据,并与本地元数据合并,计算出最新版本的快照,再从本地仓库和远程仓库检索。

下边为一个快照版本依赖的元数据maven-metadata-local.xml,包括最近更新时间戳,以及存在的不同版本:

XML?版本=“1”encoding=“UTF-8”& gt?<元数据></ GroupID GroupID >>COM。测试<<C & lt;/ artifactId artifactId >>版本><<<版本版本>>/版本>1.0-snapshot <<2.0-snapshot <版/版>></版本><;lastUpdated >20171113125841 </ lastUpdated ></版本></元数据& gt;

对应文件目录结构如下:

Maven依赖解析

其中每个版本中,包含对自身描述的元数据。以2.0-SNAPSHOT为例,其目录结构如下,主要包含jar和pom两部分,maven-metadata-local.xml为依赖元数据:

Maven依赖解析

具体元数据内容如下,记录了该版本依赖最近一次的更新时间。当本地库中没有这样的组件时,它将检索所有远程仓库,用元数据文件计算最新版本,或者在强制更新时计算最新版本。

XML?版本=“1”encoding=“UTF-8”&gt;&lt;元数据?ModelVersion= “1.1.0” > < groupId> com.test< /groupId> < artifactId> C< /artifactId> < version> 2.0-SNAPSHOT< /version> versioning> < lt; snapshot> < localCopy> true< /localCopy> < /snapshot> < lastUpdated> 20171117132322< /lastUpdated> < snapshotVersions> < snapshotVersion> < extension> jar< /extension> < value> 2.0-SNAPSHOT< /value> < updated> 20171117132322< /updated> < /snapshotVersion> < snapshotVersion> < extension> pom< /extension> < value&gt 2.0-SNAPSHOT< /value> < updated> 20171117132322< /updated> < /snapshotVersion> < /snapshotVersions> < /versio宁波理工大学;

3、相依及物性分析实例

  创建3个Maven工程A、B、C(命令mvn archetype:generate)。

  (1)编辑它们各自的POM文件以建立它们的依赖关系,如下图所示

Maven依赖解析

其中B为A的直接依赖,C具有传递性,为A的传递性依赖,分析其依赖树可以直观的看出依赖关系(mvn dependency:tree),如下:

  • B取决于C(1)

Maven依赖解析

  • a依赖于b(1),间接依赖于C(1)。

Maven依赖解析

(2)b上的C的依赖性被更改为可选的,这是可选的,此时A的依赖树如下所示,不包括C:

Maven依赖解析

(3)修改POM文件使其依赖性如下:

Maven依赖解析

看A的依赖树,如下:

Maven依赖解析

综上,正常情况下依赖是具有传递性,除非声明为optional。

总结:

  • 除了三个常用的位置元素外,声明还取决于范围、类型、选择和排除等。
  • 基于传递性和路径优先性的协议;
  • 当引用多个项目时,可能会引用其他依赖项,并应注意是否放置错误的数据包或冲突,将被引用。
  • Maven的依赖解析,而不是在本地库中的元件,Maven将远程仓库的元数据和本地仓库,然后引用最新版本。

参考资源:

  • 介绍

    依赖机制

  • “Maven实践”

文章从互联网整理而来,旨在传播scrum、软件项目管理、研发项目管理、敏捷开发管理工具的知识与应用,帮助软件开发企业真正了解研发项目管理的价值和意义,如果本文侵犯了您的权益或者您需要具体了解更多国内做研发项目管理系统的公司翼发云敏捷项目管理系统的相关信息,欢迎和我们联络:

【网址】www.effapp.com

2018-02-10T22:52:35+08:002018-02-16 12:47:43|Categories: scrum项目管理|