maven依赖范围
介绍:
管理依赖关系是Maven的核心功能。 定义Maven依赖项时, scope属性定义了该依赖项在不同的Maven生命周期阶段(例如build,test和run)上的可见性。
依赖范围限制了任何项目中依赖的传递性,从而影响了类路径。 此外,Maven中有六个不同的可用依赖范围。 在本教程中,我们将学习它们中的每一个。
传递依存关系:
Maven中的依赖关系可以是直接的也可以是传递的 。
直接依赖关系是我们明确定义POM文件的依赖关系:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
另一方面, 传递依赖是直接依赖所要求的。 所需的传递依赖项自动包含在我们的maven项目类路径中。
关键条款:
在深入学习可用的Maven范围之前,让我们首先使用一些关键术语来刷新我们的知识,
- compile-classpath :对我们项目的主要源文件具有依赖性
- test-classpath:保存测试编译和执行期间存在的依赖项
- runtime-classpath :在运行时环境及其执行中将可用的依赖项
依赖范围:
现在让我们看一下不同的Maven依赖范围:
除非另有说明,否则它是Maven中的默认范围 。 对于主要的源代码编译,我们需要这些依赖项。 同样,我们上面讨论的所有三个类路径中都提供了编译依赖项。
这些依赖关系是可传递的,因此传播到依赖项目。
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
范围设置为test的依赖项仅在test-classpath中可用。 我们只需要这些依赖关系来编译和运行单元测试用例。 而且,它不是可传递的。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
我们不需要运行时依赖来进行代码编译,但是非常需要它来在运行时执行代码 。 这样的依赖关系在编译类路径中不可用,但在测试类路径和运行时类路径中都存在。
一个很好的例子是JDBC驱动程序的依赖关系:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
<scope>runtime</scope>
</dependency>
它是可传递的。 因此,项目包装包括所有传递依赖项。
提供的依赖项仅在compile-classpath和test-classpath中可用 。 假定运行时环境(如JDK ,Web或Servlet容器等)将在部署模式下提供依赖的JARS 。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
它本质上不是可传递的。 因此,打包后,我们将无法在我们的lib文件夹中找到此范围的直接或传递依赖项。
系统范围与提供的范围非常相似。 在这里,唯一的区别是它是指本地系统中某个路径的依赖jar 。
<dependency>
<groupId>com.programmergirl</groupId>
<artifactId>my-dependency</artifactId>
<version>2.5.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/my-dependency-2.5.1.jar</systemPath>
</dependency>
使用此范围的一个缺点是我们必须在执行之前在每个系统上进行手动设置。 这样可以避免查找Maven本地存储库。 相反,它拿起在Systempath下提供的罐子 。 不出所料,此处没有传递性。
导入依赖关系范围是在Maven 2.0.9中首次引入的。 这对于基于多模块Maven的项目很有用。 要使用它,我们需要在父POM中配置<dependencyManagement> 。 另外, 它仅受<dependencyManagement>部分中类型为pom的依赖项支持。
这个想法是为了能够从其他项目中导入托管的依赖项。 因此,在我们的有效POM中 ,导入的依赖关系将替换为该项目中所有可用的有效依赖关系。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.programmergirl</groupId>
<artifactId>my-project</artifactId>
<version>1.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
可传递性解析规则:
我们的主要打包项目不包括带有范围的项目依赖项- 提供和测试 。 之所以如此,是因为它们本质上是可传递的。 为了解决具有给定范围的直接依赖项的传递性,我们具有以下规则:
- 编译 –使用运行时引入可传递的依赖关系并编译范围,而不更改其范围
- 测试 – 编译和运行时传递依赖项都通过我们项目中的测试范围引入
- 运行时 –使用项目中的运行时范围提取编译和运行时传递依赖项
- 提供 – 编译范围和运行时范围的依赖关系都将通过提供的范围引入
结论:
在本教程中,我们介绍了Maven中可用的所有六种依赖关系范围。 我们还讨论了基于Maven范围的传递依赖及其解析。
成为第一个发表评论的人。
翻译自: https://www.javacodegeeks.com/2019/05/maven-dependency-scopes.html
maven依赖范围