龙空技术网

10分钟Maven必学必会: 依赖范围、继承、以及dependencyManagement

xTech 446

前言:

此刻姐妹们对“apachecommonsmaven”大体比较着重,咱们都想要剖析一些“apachecommonsmaven”的相关知识。那么小编同时在网摘上搜集了一些有关“apachecommonsmaven””的相关知识,希望各位老铁们能喜欢,我们一起来了解一下吧!

依赖范围

Maven 具有以下 6 中常见的依赖范围,如下表所示。

依赖范围

描述

compile

编译依赖范围,scope 元素的缺省值。使用此依赖范围的 Maven 依赖,对于三种 classpath 均有效,即该 Maven 依赖在上述三种 classpath 均会被引入。例如,log4j 在编译、测试、运行过程都是必须的。

test

测试依赖范围。使用此依赖范围的 Maven 依赖,只对测试 classpath 有效。例如,Junit 依赖只有在测试阶段才需要。

provided

已提供依赖范围。使用此依赖范围的 Maven 依赖,只对编译 classpath 和测试 classpath 有效。例如,servlet-api 依赖对于编译、测试阶段而言是需要的,但是运行阶段,由于外部容器已经提供,故不需要 Maven 重复引入该依赖。

runtime

运行时依赖范围。使用此依赖范围的 Maven 依赖,只对测试 classpath、运行 classpath 有效。例如,JDBC 驱动实现依赖,其在编译时只需 JDK 提供的 JDBC 接口即可,只有测试、运行阶段才需要实现了 JDBC 接口的驱动。

system

系统依赖范围,其效果与 provided 的依赖范围一致。其用于添加非 Maven 仓库的本地依赖,通过依赖元素 dependency 中的 systemPath 元素指定本地依赖的路径。鉴于使用其会导致项目的可移植性降低,一般不推荐使用。

import

导入依赖范围,该依赖范围只能与 dependencyManagement 元素配合使用,其功能是将目标 pom.xml 文件中 dependencyManagement 的配置导入合并到当前 pom.xml 的 dependencyManagement 中。

多模块

公司环境中,或者是稍微复杂一点的maven项目,一般会使用多模块。

父pom文件定义的dependencies在子模块中会被继承,就是说:子模块无需引用任何包,就拥有了父pom所定义的所有包了。

那么,为何经常在一些稍微复杂的项目中看到dependencyManagement呢?

这是因为:子模块可以通过继承获得父模块中声明的全部依赖,这样虽然避免了在各个子模块 POM 中重复进行依赖声明,但也极有可能造成子模块中引入一些不必要的依赖。为此 Maven 引入了 dependencyManagement 来对依赖进行管理。

使用dependencyManagement 管理依赖的特点:

在dependencyManagement标签中声明的依赖不会自动引入到项目模块中,只有通过在dependencies中声明了同样的包,才会引入到模块中。若dependencies中声明的包没有指明版本,则使用dependencyManagement中声明的版本,否则dependencies声明的版本将覆盖dependencyManagement的声明。

这样,我们既可以从全局管理项目依赖,总体上进行版本统一化管理,又可以为模块本身排除不需要的依赖,或者进行定制所依赖的版本。

下面这是1个例子,包括2个模块:ModuleOne和ModuleTwo。

父pom文件

<?xml version="1.0" encoding="UTF-8"?><project xmlns=";         xmlns:xsi=";         xsi:schemaLocation=" ;>    <modelVersion>4.0.0</modelVersion>    <groupId>org.example</groupId>    <artifactId>MavenDemo</artifactId>    <version>1.0-SNAPSHOT</version>    <modules>        <module>ModuleOne</module>        <module>ModuleTwo</module>    </modules>    <packaging>pom</packaging>    <dependencyManagement>        <dependencies>            <dependency>                <groupId>junit</groupId>                <artifactId>junit</artifactId>                <version>4.9</version>                <scope>test</scope>            </dependency>            <dependency>                <groupId>mysql</groupId>                <artifactId>mysql-connector-java</artifactId>                <version>5.1.18</version>                <scope>runtime</scope>            </dependency>            <dependency>                <groupId>c3p0</groupId>                <artifactId>c3p0</artifactId>                <version>0.9.1</version>            </dependency>            <dependency>                <groupId>commons-lang</groupId>                <artifactId>commons-lang</artifactId>                <version>2.6</version>            </dependency>        </dependencies>    </dependencyManagement></project>

子模块ModuleTwo pom文件

父pom声明了4个dependency,而该模块根据需要,只声明使用其中的1个,即commons-lang包,使用新的版本覆盖了一个,即mysql-connector-jav 8.0.30

<?xml version="1.0" encoding="UTF-8"?><project xmlns=";         xmlns:xsi=";         xsi:schemaLocation=" ;>    <parent>        <artifactId>MavenDemo</artifactId>        <groupId>org.example</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>    <artifactId>ModuleTwo</artifactId>    <dependencies>        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>            <version>8.0.30</version>            <scope>runtime</scope>        </dependency>        <dependency>            <groupId>commons-lang</groupId>            <artifactId>commons-lang</artifactId>        </dependency>    </dependencies></project>

标签: #apachecommonsmaven