在Maven中,依赖是另一个存档-JAR,ZIP等等 - 当前项目需要编译,构建,测试和/或运行。依赖关系收集在pom.xml
<dependencies>标记内的文件中。
运行构建或执行maven目标时,将解析这些依赖项,然后从本地存储库加载这些依赖项。如果它们不在那里,那么Maven将从远程存储库下载它们并将它们存储在本地存储库中。您也可以手动安装依赖项。
目录
依赖关系示例
外部依赖
关系
依赖关系树依赖关系排除
工件版本范围
Maven依赖示例
在进一步深入内部依赖关系管理之前,让我们有一个快速示例,其中包含我们将在本文中讨论的不同元素。
< dependencies > < dependency > < groupId >junit</ groupId > < artifactId >junit</ artifactId > < version >4.12</ version > < scope >test</ scope > </ dependency > < dependency > < groupId >org.springframework</ groupId > < artifactId >spring-core</ artifactId > < version >4.3.5.RELEASE</ version > </ dependency > </ dependencies > |
如果pom.xml
指向相同的多个工件groupId
,则应使用属性以便对代码进行分解以便于维护。
< properties > < junit.version >4.12</ junit.version > < spring.version >4.3.5.RELEASE</ spring.version > </ properties > < dependencies > < dependency > < groupId >junit</ groupId > < artifactId >junit</ artifactId > < version >${junit.version}</ version > < scope >test</ scope > </ dependency > < dependency > < groupId >org.springframework</ groupId > < artifactId >spring-core</ artifactId > < version >${spring.version}</ version > </ dependency > </ dependencies > |
外部依赖
有时,您将不得不引用不在maven存储库(neiter本地,中央或远程存储库)中的jar文件。您可以通过将这些jar放在项目的lib
文件夹中来使用这些jar 并配置外部依赖项,如下所示:
< dependency > < groupId >extDependency</ groupId > < artifactId >extDependency</ artifactId > < scope >system</ scope > < version >1.0</ version > < systemPath >${basedir}\war\WEB-INF\lib\extDependency.jar</ systemPath > </ dependency > |
- 在
groupId
和artifactId
都被设置为依赖的名称。 - 的
scope
元件值被设定为system
。 - 该
systemPath
元素指的是JAR文件的位置。
Maven依赖树
使用maven的dependency:tree
命令,您可以传递查看项目中所有依赖项的列表。传递依赖意味着如果A依赖于B而B依赖于C,那么A取决于B和C.
当不同依赖项包含相同工件的不同版本时,传递性会带来非常严重的问题。它可能会导致运行时版本不匹配问题。在这种情况下,dependency:tree
命令在处理JAR冲突时非常有用。
$ mvn依赖:树
它以给定的格式输出依赖信息:
[INFO] --- maven-dependency-plugin: 2.1 :tree ( default -cli) @ MavenExamples --- [INFO] com.howtodoinjava.demo:MavenExamples:jar: 0.0 . 1 -SNAPSHOT [INFO] +- junit:junit:jar: 3.8 . 1 :test [INFO] \- org.springframework:spring-core:jar: 4.3 . 5 .RELEASE:compile [INFO] \- commons-logging:commons-logging:jar: 1.2 :compile |
看看它如何告知有依赖的春天commons-logging
。同样,您可以使用此命令获取完整的传递依赖项信息。
Maven依赖性排除
除了由传递依赖性引起的版本不匹配问题之外,项目工件和部署平台(例如Tomcat或其他服务器)的工件之间可能存在版本不匹配。
为解决此类版本不匹配问题,maven提供了<exclusion>
标记,以打破传递依赖性。
例如,当您在类路径中包含JUnit 4.12并包含DBUnit依赖项时,则需要删除JUnit 3.8.2依赖项。它可以用exclusion
标签完成。
< dependency > < groupId >junit</ groupId > < artifactId >junit</ artifactId > < version >${junit.version}</ version > < scope >test</ scope > </ dependency > < dependency > < groupId >org.dbunit</ groupId > < artifactId >dbunit</ artifactId > < version >${dbunit.version}</ version > < scope >test</ scope > < exclusions > <!--Exclude transitive dependency to JUnit-3.8.2 --> < exclusion > < artifactId >junit</ artifactId > < groupId >junit</ groupId > </ exclusion > </ exclusions > </ dependency > |
工件版本范围
在包含依赖项时,您可以自由地为任何工件指定一系列版本。要提供版本范围,您可以使用以下符号:
- 括号(和)暗示包括范围
- 括号标志[和]暗示排除范围
- 逗号分隔子集
版本范围示例
让我们举几个例子来更好地指出版本范围。
范围 | 含义 |
---|
1.2 | 版本等于1.2或从1.2开始 |
(,1.2] | 任何小于1.2的版本。包含1.2版。x <= 1.2 |
(1.2) | 任何小于1.2的版本。版本1.2排除在外。x < 1.2 |
[1.2] | 仅限1.2版。x == 1.0 |
[1.2,) | 任何大于1.2的版本。包含1.2版。x >= 1.2 |
(1.2) | 任何大于1.2的版本。版本1.2排除在外。x > 1.2 |
(1.2,2.2) | 版本介于1.2和2.2之间。都被排除在外1.0 < x < 2.0 |
[1.2,2.2] | 版本介于1.2和2.2之间。都包括在内。1.2 <= x <= 2.2 |
(,1.2],[2.2,) | 版本低于1.2或大于2.2。都包括在内。x <= 1.2 or x >= 2.2 |