maven的依赖范围_Maven依赖范围

maven的依赖范围

maven的依赖范围

介绍:

管理依赖项是Maven的核心功能。 在定义Maven依赖项时, scope属性定义了该依赖项在不同的Maven生命周期阶段(例如build,testrun)上的可见性。

依赖范围限制了任何项目中依赖的传递性,从而影响了类路径。 另外,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-classpathtest-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的依赖范围

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值