关于Maven,你真的了解它吗?(下)

简介: 关于Maven,你真的了解它吗?(下)
  1. 先声明者优先

案例:根据上述案例场景,其他代码不变,假如模块maven_makefriend在pop.xml中同时引入模块maven_make与maven_hellofriend的jar包,那它会用哪个版本的log4j的jar包?

模块maven_makefriend在pop.xml中同时引入模块maven_make与maven_hellofriend的jar包

代码示例如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>maven_test</artifactId>
        <groupId>com.bd</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>maven_makefriend</artifactId>
    <dependencies>
    //同时引入模块maven_make与maven_hellofriend的jar包
        <dependency>
            <groupId>com.bd</groupId>
            <artifactId>maven_make</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.bd</groupId>
            <artifactId>maven_hellofriend</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>


三. 在Maven中如何统一管理依赖的版本号?

语法:

示例代码如下

<properties>
    <spring-version>5.3.17</spring-version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${spring-version]</version>
    </dependency>
</dependencies>

ps:

这样做的好处是只需要修改一处,即<properties></properties>内的版本号,就可以修改多处的值,即<dependencies></dependencies>内所有应用

${spring-version} 的值。在外面定义版本号,里面使用,然后统一管理,统一修改相关jar包的版本号,进而提高编码效率。


四. Maven中的继承是什么?

4.1 为什么需要继承?

原因:

如果有多个子工程都使用同一个jar包,则可以将该jar包提取到父工程中,使用【继承原理】在子工程中使用,类似于Java中的子类继承父类

注意:

父工程的打包方式【jar/war/pom】,必须是pom方式

4.2 Maven的继承方式一

用法:

只需要在父工程中的pop.xml中引入指定jar包的坐标,那么它所有的子工程都默认强制引入父工程中的所有jar包

案例:在父工程maven_demo内创建两个子工程(day01_mavenTest与day01_mavenTest1)与一个工程day01_mavenHello,在父工程内的pop.xml里引入两个jar包(junit

4.12和junit-jupiter-api 5.9.2),其他工程内pop.xml不做任何jar包的坐标引入,演示观察继承效果

示例代码如下:

在父工程的pop.xml 引入两个jar包的坐标(junit 4.12和junit-jupiter-api 5.9.2)

//父工程的pop.xml 引入两个jar包的坐标(junit  4.12和junit-jupiter-api 5.9.2)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.bd</groupId>
    <artifactId>maven_demo</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>day01_mavenTest</module>
        <module>day01_mavenTest1</module>
    </modules>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.9.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

有一个问题?

假设在上述案例场景中,子工程day01_mavenTest1的pop.xml内想要引入junit 4.11的jar包坐标,那么它的依赖目录下会应用从父工程继承的junit 4.12 的jar包,还是在pop.xml中准备引入的junit 4.11的jar包?

答案:子工程day01_mavenTest1的依赖中会应用pop.xml中准备引入的junit 4.11的jar包,原因是根据依赖的传递性规则中最短路径者优先【就近原则】。

如下所示:

4.3 Maven的继承方式二

在该继承方式中,子工程可以自由选择应用从父工程继承的jar包资源

用法:

①在父工程中的pop.xml将导入的jar包放入<dependencyManagement></dependencyManagement>内。

示例代码如下:

//在父工程中的pop.xml里导入junit 4.12 的jar包,不过是放在
//dependencyManagement</dependencyManagement>内
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

②在子工程中的pop.xml中引入父工程的相关jar包,要这样写(如下所示)

示例代码如下:

<parent>
    <artifactId>maven_demo</artifactId>
    <groupId>com.atguigu</groupId>
    <version>1.0-SNAPSHOT</version>
    //加入下面的代码,要写父工程pop.xml的相对路径
    <relativePath>../pom.xml</relativePath>
</parent>
//注意不能加要引入jar包的版本号
 <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
</dependencies>

注意: 绝对不能添加指定导入的jar包的版本号

案例:在父工程maven_demo内创建两个子工程(day01_mavenTest与day01_mavenTest1)与一个工程day01_mavenHello,在父工程内的pop.xml里引入两个jar包(junit

4.12和junit-jupiter-api 5.9.2),使用上述语法引入,子工程day01_mavenTest内的pop.xml使用继承方式二的语法引入父工程junit 4.12 的jar包的坐标引,演示观察继承效果

①父工程maven_demo内pop.xml中导入相关jar包

示例代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.bd</groupId>
    <artifactId>maven_demo</artifactId>
    //规定父工程的打包方式必须是pom
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>day01_mavenTest</module>
        <module>day01_mavenTest1</module>
    </modules>
    <dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.9.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    </dependencyManagement>
</project>

②子工程day01_mavenTest的pop.xml内指定引入夫父工程中junit 4.12 的jar包

示例代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>maven_demo</artifactId>
        <groupId>com.bd</groupId>
        <version>1.0-SNAPSHOT</version>
        <!--  以相对路径引入父工程pop.xml      -->
        <relativePath>../pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>day01_mavenTest</artifactId>
    <!--  指定导入父工程中的junit 4.12 的jar包  -->
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    </dependencies>
</project>


五. Maven 的聚合是什么?

释义:

在 Maven 中,聚合(Aggregation)是将多个项目组织在一起构建的一种特殊方式。这可以使多个项目成为单个构建,在一个命令下执行所有构建步骤。

聚合通常用于处理具有相同构建要求的多个项目。例如,大型应用程序可能由多个模块组成,每个模块都需要编译、测试、打包和部署成独立的库或组件。在这种情况下,可以将所有模块配置为使用 Maven 聚合进行构建,并使用一个父级 pom.xml 文件来定义它们之间的关系。

5.1 如果不使用Maven的聚合,会发生什么?

如果不使用聚合功能,在项目中就不能管理多个子模块,也不能一次性构建整个代码库。此外,没有聚合,每个模块都需要单独编译、测试和部署,增加了工作量和复杂度。因此,使用Maven的聚合功能可以极大的简化项目的管理并提高开发的效率。

5.2 使用Maven聚合的好处

好处:

只要将子工程聚合到父工程中,就可以实现效果(安装或清除父工程时,子工程会进行同步操作)。换而言之,就是在点击父工程的install 或 clean,安装父工程的同时,它的子工程也会同时安装,clean时 一起 clean。

5.3 如何使用Maven的聚合?

Maven 使用 <modules> 元素管理所有相关的子工程(子模块)。该元素包含一系列 <module> 子元素,其中每个子元素指定要聚合的 Maven 项目的目录名称

语法:

代码示例如下

<modules>
    <module>day01_mavenTest</module>
    <module>day01_mavenTest1</module>
</modules>

<modules> 元素下包含了两个子元素,即 day01_mavenTest、day01_mavenTest1。这意味着 该pop.xml所在的Maven项目 将聚合这两个项目,并在一个命令下一起执行它们的构建。

注意是在要将某一个Maven项目作为聚合的“容器”,它负责聚合容纳其他要聚合的Maven项目,是身为“聚合容器”的Maven项目下的pop.xml里写,类似Java中的抽象类与接口的概念

案例:演示Maven聚合的功能(点击”install“功能 安装父工程时,则同时安装它子工程)

安装之前:

安装之后:

注意:

Maven会按照依赖顺序自动安装子工程

相关文章
|
SQL 分布式计算 大数据
大数据Spark框架概述
大数据Spark框架概述
475 0
|
9月前
|
存储 缓存 负载均衡
如何设计一个注册中心?以Zookeeper为例
本文介绍了分布式系统中注册中心的设计与工作原理,重点讲解了Zookeeper作为注册中心的实现。注册中心需具备服务注册、注销、心跳检测、服务查询等功能,确保高可用性。Zookeeper通过层次命名空间和znode存储数据,支持服务注册与发现,并采用发布-订阅模式通知消费者服务变更。然而,Zookeeper存在选举期间不可用的问题,不太适合作为注册中心,因其CP模型优先保证一致性而非可用性。
484 78
|
8月前
|
数据采集 JSON 监控
速卖通商品列表接口(以 AliExpress Affiliate 商品查询 API 为例)
以下是使用 Python 调用速卖通商品列表接口(以 AliExpress Affiliate 商品查询 API 为例)的代码示例。该示例包含准备基础参数、生成签名、发送请求和处理响应等关键步骤,并附有详细注释说明。代码展示了如何通过公共参数和业务参数构建请求,使用 HMAC-SHA256 加密生成签名,确保请求的安全性。最后,解析 JSON 响应并输出商品信息。此接口适用于商品监控、数据采集与分析及商品推荐等场景。注意需通过 OAuth2.0 获取 `access_token`,并根据官方文档调整参数和频率限制。
|
11月前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
216 8
|
11月前
|
数据采集 人工智能 文字识别
如何绕过Captcha并使用OCR技术抓取数据
在现代网页数据抓取中,Captcha作为一种防止爬虫和恶意访问的措施,广泛应用于各种网站。本文介绍如何使用OCR技术绕过文字Captcha,并通过代理IP技术提高爬虫的隐蔽性。具体实现包括下载Captcha图片、使用Tesseract OCR识别文字、通过代理IP抓取目标数据。示例代码展示了如何抓取大众点评的商家信息。
428 0
如何绕过Captcha并使用OCR技术抓取数据
|
JavaScript Java 测试技术
基于SpringBoot+Vue的高校科研机构管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的高校科研机构管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
222 0
|
Kubernetes Shell 容器
在k8S中,当一个Pod有多个容器时,如何连接到指定容器?
在k8S中,当一个Pod有多个容器时,如何连接到指定容器?
|
XML JSON Java
OpenFeign深入学习笔记
OpenFeign 是 Spring Cloud 生态系统中的一个强大工具,它使得微服务之间的通信变得更加简单和高效。通过使用 OpenFeign,开发者可以专注于业务逻辑的实现,而不需要关心底层的 HTTP 通信细节。
225 0
|
监控 安全 Java
【多线程学习】深入探究阻塞队列与生产者消费者模型和线程池常见面试题
【多线程学习】深入探究阻塞队列与生产者消费者模型和线程池常见面试题
252 1

热门文章

最新文章