Maven框架的jar管理方式

Maven利用POM进行项目管理,包括依赖的传递性,遵循最短路径和最先声明原则。依赖范围有compile、provided、runtime、system和test。此外,文章还介绍了继承和聚合概念,以及如何创建聚合工程。
摘要由CSDN通过智能技术生成

Maven工具基于POMProject Object Model,项目对象模型)模式实现的。在Maven中每个项目都相当于是一个对象,对象(项目)和对象(项目)之间是有关系的。关系包含了:依赖、继承、聚合,实现Maven项目可以更加方便的实现导jar包、拆分项目等效果。

依赖

特性_依赖的传递性

传递性依赖是Maven2.0的新特性。假设你的项目依赖于一个库,而这个库又依赖于其他库。你不必自己去找出所有这些依赖,你只需要加上你直接依赖的库,Maven会隐式的把这些库间接依赖的库也加入到你的项目中。这个特性是靠解析从远程仓库中获取的依赖库的项目文件实现的。一般的,这些项目的所有依赖都会加入到项目中,或者从父项目继承,或者通过传递性依赖。

如果A依赖了B,那么C依赖A时会自动把AB都导入进来。

原则_两个原则

1】第一原则:最短路径优先原则

“最短路径优先”意味着项目依赖关系树中路径最短的版本会被使用。

例如,假设ABC之间的依赖关系是A->B->C->D(2.0) A->E->(D1.0),那么D(1.0)会被使用,因为A通过ED的路径更短。

2】第二原则:最先声明原则

依赖路径长度是一样的的时候,第一原则不能解决所有问题,比如这样的依赖关系:A>B>Y(1.0)A>C>Y(2.0)Y(1.0)Y(2.0)的依赖路径长度是一样的,都为2。那么到底谁会被解析使用呢?在maven2.0.8及之前的版本中,这是不确定的,但是maven2.0.9开始,为了尽可能避免构建的不确定性,maven定义了依赖调解的第二原则:第一声明者优先。在依赖路径长度相等的前提下,在POM中依赖声明的顺序决定了谁会被解析使用。顺序最靠前的那个依赖优胜。

排除依赖

exclusions 用来排除传递性依赖 其中可配置多个exclusion标签,每个exclusion标签里面对应的有groupId, artifactId, version三项基本元素。注意:不用写版本号。

依赖范围

compile

这是默认范围。如果没有指定,就会使用该依赖范围。表示该依赖在编译和运行时都生效。

provided

已提供依赖范围。使用此依赖范围的Maven依赖。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复地引入一遍(如:servlet-api)

runtime范围表明编译时不需要生效,而只在运行时生效。典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。

system

系统范围与provided类似,不过你必须显式指定一个本地系统路径的JAR,此类依赖应该一直有效,Maven也不会去仓库中寻找它。但是,使用system范围依赖时必须通过systemPath元素显式地指定依赖文件的路径。

test

test范围表明使用此依赖范围的依赖,只在编译测试代码和运行测试的时候需要,应用的正常运行不需要此类依赖。典型的例子就是JUnit,它只有在编译测试代码及运行测试的时候才需要。Junitjar包就在测试阶段用就行了,你导出项目的时候没有必要把junit的东西到处去了就,所在在junit坐标下加入scope-test

Import

import范围只适用于pom文件中的部分。表明指定的POM必须使用部分的依赖。

注意:import只能用在dependencyManagementscope里。

继承

如果A工程继承B工程,则代表A工程默认依赖B工程依赖的所有资源,且可以应用B工程中定义的所有资源信息。

被继承的工程(B工程)只能是POM工程。

注意:在父项目中放在中的内容时不被子项目继承,不可以直接使用。

放在中的内容主要目的是进行版本管理。里面的内容在子项目中依赖时坐标只需要填写和即可。(注意:如果子项目不希望使用父项目的版本,可以明确配置version)。

聚合

当我们开发的工程拥有2个以上模块的时候,每个模块都是一个独立的功能集合。比如某大学系统中拥有搜索平台,学习平台,考试平台等。开发的时候每个平台都可以独立编译,测试,运行。这个时候我们就需要一个聚合工程。

在创建聚合工程的过程中,总的工程必须是一个POM工程(Maven Project)(聚合项目必须是一个pom类型的项目,jar项目war项目是没有办法做聚合工程的),各子模块可以是任意类型模块(Maven Module)。

前提:继承。

聚合包含了继承的特性。

聚合时多个项目的本质还是一个项目。这些项目被一个大的父项目包含。且这时父项目类型为pom类型。同时在父项目的pom.xml中出现表示包含的所有子模块。

总项目:一般总项目:POM项目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值