《Maven官方文档》-Maven依靠机制简介-Java-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝29
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:183回复:0

  《Maven官方文档》-Maven依靠机制简介

楼主#
更多 发布于:2016-05-20 18:48

《Maven官方文档》-Maven依靠机制简介

原文地址 译者:Tyrian

依靠机制是Maven最为用户熟知的特性之一,一起也是Maven所擅长的范畴之一。单个项意图依靠办理并不难,

可是当你面对包括数百个模块的多模块项目和运用时,Maven能帮你确保项意图高度操控力和稳定性。

纲要:

传递性依靠

扫除、可选依靠

依靠规模

依靠办理

导入依靠

体系依靠

传递性依靠

传递性依靠是Maven2.0的新特性。假定你的项目依靠于一个库,而这个库又依靠于别的库。你不用自个去找出一切这些依靠,你只需求加上你直接依靠的库,Maven会隐式的把这些库直接依靠的库也参加到你的项目中。这个特性是靠解析从长途库房中获取的依靠库的项目文件完成的。一般的,这些项意图一切依靠都会参加到项目中,或许从父项目承继,或许经过传递性依靠。

传递性依靠的嵌套深度没有任何限制,只是在呈现循环依靠时会报错。

传递性依靠会致使包括库的依靠图增长的非常大。为了处理这个疑问,Maven也供给了额定的机制,能让你指定哪些依靠会被包括:

依靠调停 – 当项目中呈现多个版别构件依靠的景象,依靠调处理定最终应当运用哪个版别。现在,Maven

2.0只支撑“短途径优先”原则,意思是项目会选择依靠联系树中途径最短的版别作为依靠。当然,你也能够在项目POM文件中显式指定运用哪个版别。值得留意的是,在Maven2.0.8及之前的版别中,当两个版别的依靠途径长度共一起,哪个依靠会被运用是不断定的。不过从Maven

2.0.9开端,POM中依靠声明的次序决议了哪个版别会被运用,也叫作”榜首声明原则”。

“短途径优先”意味着项目依靠联系树中途径最短的版别会被运用。例如,假定A、B、C之间的依靠联系是A->B->C->D(2.0)和A->E->(D1.0),那么D(1.0)会被运用,由于A经过E到D的途径更短。但假设你想要强行运用D(2.0),那你也能够在A中显式声明对D(2.0)的依靠。

依靠办理 –

在呈现传递性依靠或许没有指定版别时,项目作者能够经过依靠办理直接指定模块版别。之前的章节说过,由于传递性依靠,虽然某个依靠没有被A直接指定,但也会被引进。相反的,A也能够将D参加元素中,并在D也许被引证时决议D的版别号。

依靠规模 – 你能够指定只在当时编译规模内包括适宜的依靠。 下面会介绍更多有关的细节。

扫除依靠 –

假设项目X依靠于项目Y,项目Y又依靠项目Z,项目X的一切者能够运用”exclusion”元从来显式扫除项目Z。

可选依靠 –

假设项目Y依靠项目Z,项目Y的一切者能够运用”optional”元从来指定项目Z作为X的可选依靠。那么当项目X依靠项目Y时,X只依靠Y并不依靠Y的可选依靠Z。项目X的一切者也能够依据自个的志愿显式指定X对Z的依靠。(你能够把可选依靠理解为默许扫除)。

依靠规模

依靠规模会影响传递性依靠,一起也会影响项目构建使命中运用的classpath。

Maven有以下6种依靠规模:

compile

这是默许规模。假设没有指定,就会运用该依靠规模。编译依靠对项目一切的classpath都可用。此外,编译依靠会传递到依靠的项目。

provided

和compile规模很相似,但provided规模标明你期望由JDK或许某个容器供给运转时依靠。例如,当运用Java

EE构建一个web运用时,你会设置对Servlet API和有关的Java EE

APIs的依靠规模为provided,由于web容器供给了运转时的依靠。provided依靠只对编译和测验classpath有用,而且不能传递。

runtime

runtime规模标明编译时不需求依靠,而只在运转时依靠。此依靠规模对运转和测验classpath有用,对编译classpath无效。

test

test规模标明运用此依靠规模的依靠,只在编译测验代码和运转测验的时分需求,运用的正常运转不需求此类依靠。

system

体系规模与provided相似,不过你有必要显式指定一个本地体系途径的JAR,此类依靠应当一向有用,Maven也不会去库房中寻觅它。

import(Maven2.0.9及以上)

import规模只适用于pom文件中的有些。标明指定的POM有必要运用有些的依靠。由于依靠现已被更换,所以运用import规模的依靠并不影响依靠传递。

每类依靠规模(除了import)经过不相同方式影响传递性依靠,详细如下表所示。最左边一列代表了直接依靠规模,最顶层一行代表了传递性依靠的规模,行与列的穿插单元格就表明最终的传递性依靠规模。表中的“-“表明该传递性依靠将会被忽略。

compileprovidedruntimetest

compilecompile(*)–runtime–

providedprovided–provided–

runtimeruntime–runtime–

testtest–test–

(*)留意:这儿正本应当是compile规模,那样的话compile规模都有必要显式指定-但是,有这么一种状况,你依靠的、承继自其它库中的类的库有必要在编译时可用。考虑到这个因素,即便在依靠性传递状况下,编译时依靠仍然是compile规模。

依靠办理

Maven供给了一个机制来会集办理依靠信息,叫做依靠办理元素””。假定你有很多项目承继自同一个公有的父项目,那能够把一切依靠信息放在一个公共的POM文件,而且在子POM中简略第引证该构件即可。经过一些比如能够非常好的解说这个机制。下面是两个承继自同一个父项意图POM:

项目A

group-a

artifact-a

1.0

group-c

excluded-artifact

group-a

artifact-b

1.0

bar

runtime

项目B

group-c

artifact-b

1.0

war

runtime

group-a

artifact-b

1.0

bar

runtime

这两个POM都依靠于同一个模块,一起每个POM又各自依靠于一个无关的模块。父项意图POM详细信息如下所示:

group-a

artifact-a

1.0

group-c

excluded-artifact

group-c

artifact-b

1.0

war

runtime

group-a

artifact-b

1.0

bar

runtime

这么两个子项意图POM文件就简略多了。

group-a

artifact-a

group-a

artifact-b

bar

group-c

artifact-b

war

group-a

artifact-b

bar

留意:在这两个POM文件的依靠中,咱们有必要指定元素。由于与依靠办理元素匹配的依靠引证最小信息集是{groupId,

artifactId, type,

classfier}。很多状况下,依靠指向的jar不需求指定classfier。由于默许type是jar,默许classfiler为空,所以咱们能够把信息集设置为{groupId,

artifactId}。

依靠办理元素第二个非常有用的功用是操控传递性依靠中构件的版别。比如如下

项目A:

4.0.0

maven

A

pom

A

1.0

test

a

1.2

test

b

1.0

compile

test

c

1.0

compile

test

d

1.2

项目B:

A

maven

1.0

4.0.0

maven

B

pom

B

1.0

test

d

1.0

test

a

1.0

runtime

test

c

runtime

当在maven中有项目依靠B时,不论它们的pom文件中指定的版别是什么,构件a,b,c和d的版别都是1.0。

a和c都被声明为这个项意图依靠,依据依靠调停,a和c的版别都是1.0.一起a和c的依靠规模都被显式指定为runtime。

b界说在B的父项意图元素中,由于在依靠性传递中优先于依靠调停,所以b的版别是1.0,b是编译依靠规模。

最终,d是界说在B的元素中。

依靠办理的标签详细描绘信息能够从这儿获取项目描绘符引证

导入依靠

这个章节描绘的特性只在Maven2.0.9及以后的版别才有。这意味着更早版别的Maven不会解析包括import元素的pom文件。因此在运用该特性前,你有必要慎重考虑。假设你计划运用这个特性,咱们主张你运用enforcer插件来强行运用Maven2.0.9及以上版别。

前面的比如描绘了怎样经过承继来指定办理的依靠。但是,这关于更大的项目通常会更复杂,由于一个项目只能承继自一个父项目。为了处理这个疑问,项目能够导入别的项意图办理依靠,这能够经过声明依靠一个包括值为”import”的元素的构件来完成。

项目B:

4.0.0

maven

B

pom

B

1.0

maven

A

1.0

pom

import

test

d

1.0

test

a

1.0

runtime

test

c

runtime

假定A就是上一个比如中界说的POM,那么最终的结果也是共同的。除了在B中界说的d模块,一切A的办理依靠都会导入到B中。

项目X:

4.0.0

maven

X

pom

X

1.0

test

a

1.1

test

b

1.0

compile

项目Y:

4.0.0

maven

Y

pom

Y

1.0

test

a

1.2

test

c

1.0

compile

项目Z:

4.0.0

maven

Z

pom

Z

1.0

maven

X

1.0

pom

import

maven

Y

1.0

pom

import

在上面的比如中,Z导入了X和Y的办理依靠。不过有个疑问,X和Y都包括了依靠a。在这儿,会运用1.1版别的a,由于X先被声明,而且a没有在Z的依靠办理中声明。

这个进程是递归进行的。假设X导入了别的的POM,Q,那么当解析Z的时分,一切Q的办理依靠看上去就都像在X中界说的相同。

当界说一个用于构建多项意图包括一些有关构件的依靠“库”时,导入依靠就非常有用。从“库”中引证一个或多个构件到项目中,是一种很多见的做法。但是,

坚持项目中运用的依靠版别与库中发布的版别共同会有点费事。下面的形式描绘了怎样生成一个供其它项目运用的“物料清单”(BOM)。

项意图根元素是BOM

pom文件。它界说了库中创立的一切构件版别。其它要运用该库的项目有必要将该pom导入到其pom文件中的元素中。

<project

xmlns=”[url]http://maven.apache.org/POM/4.0.0

优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客