0%

Maven-5-继承与聚合

继承

基本概念

假如有这样一个场景,我们的项目现在有三个子Maven工程(A、B和C),如果3个工程都需要使用到同一个Jar包,那么我们在打包项目的时候就需要将这三个工程中用到的相同包的版本进行统一,那么按照之前的做法就需要去到每一个工程中手动修改3个工程共用的Jar包为同一个版本,这个做法无疑是非常不可取的,如果子项目较多,出现依赖交叉的情况也会越多,这样工作量是非常大的。

使用继承机制就可以将这样的依赖信息统一提取到父工程模块中进行统一管理。

效果演示

为了演示继承的效果,在此首先新建立两个Maven工程ParentChild

对于父工程的pom(Parent).xml文件需要做以下配置。

  1. 修改打包方式为pom

    image-20230703202920576

  2. <dependencies></dependencies>标签外部添加<dependencyManagement></dependencyManagement>标签。并在<dependencies></dependencies>内部指定依赖及其版本。

    image-20230703203128341

对于子工程的pom(Child).xml文件做以下配置,使其继承父工程的依赖。

  1. 设置<Parent></Parent>标签,并在标签内部指定父工程坐标和配置文件的相对路径。

    image-20230703203442975

  2. 在子工程中添加依赖包的坐标(省略版本号和可见性)

    image-20230703203546522

重新加载父工程和子工程,查看子工程依赖情况如下:

image-20230703203816013

可以看到子工程中只有一个junit并且其版本就是我们在父工程中指定的4.9

删除父工程中的<dependencyManagement>

<dependencyManagement></dependencyManagement>标签的作用是,不直接将父工程中所有的依赖全部传给子工程,而且让子工程有需要的时候在依赖中指定坐标并省略版本号和可见范围。

如果不写该标签,那么默认就是将所有的依赖给到继承自父工程的所有子工程。

pom(Parent).xml

image-20230703204318808

pom(Child).xml

image-20230703205906242

这个时候再次查看子工程的依赖情况,现在子工程就获取到了父工程中的所有依赖。

image-20230703210105633

聚合

假如有这样一个场景,有三个工程A1工程依赖A2A2工程依赖A3。那么如果我们现在要打包工程A1,那么就需要先打包工程A3,再打包工程A2这样才可以再去打包工程A1

pom(A1).xml

image-20230703213234954

pom(A2).xml

image-20230703213245379

pom(A3).xml

image-20230703213259429

效果演示如下:

  • 直接打包工程A1发现打包失败

image-20230703212835413

  • 直接打包工程A2发现打包也失败

image-20230703212925890

  • 打包A3并将打包的结果放入本地仓库成功。

image-20230703213027122

  • 此时再次打包A2并放入本地仓库,操作成功。

image-20230703213059326

  • 最后打包A1并放入本地仓库,也成功。

image-20230703213141330

我们发现我们要想打包某个Maven工程,必须提前知道该工程的所有依赖和依赖关系,才可导入成功。使用聚合操作就可以让Maven自动帮我们按照顺序加载依赖并进行打包。

要使用聚合功能,需要使用到<modules></modules>标签。

例如修改A1工程中的配置文件如下:

image-20230703214426352

直接对A工程进行打包,查看结果。

image-20230703214445792

可以看到,我们在写<modules></modules>标签中的内容时,特地将A2写在前面,对A1进行打包时,他会自动识别需要先打包A3,再打包A2。这就是聚合操作的一个特点。

Maven库站

可以该网站https://mvnrepository.com/搜索你想要的jar包的依赖信息。

例如在该网站中搜索mysql,那么他会自动的帮你找到mysqljar包驱动。

image-20230703215023378

并且有各种版本的jar包信息。

点击其中一个后,在网页中会自动给出对应的依赖包坐标。

image-20230703215234123

复制该坐标信息到Maven工程中的配置文件中,会自动帮我们去下载想要的依赖jar包。

image-20230703215335322

Maven生成环境问题解决

在使用maven过程中,我们所使用的jar包是会到中央仓库中进行下载的,但是如果再下载过程中因为网络不通畅等原因,会导致jar包下载失败,并且会形成一个xxxx.lastupdated的文件,但是此时maven并不会将其删掉后重新下载,而是认为它下载过了,我们需要做的是将.xxxxlastupdated文件手动删除后,再次重新下载。

Maven打包插件

Maven本身的打包插件不负责将依赖的jar包一并打入到jar包中。那么就会导致一个问题,如果某个项目的jar包依赖在服务器中提供则不会有问题,万一不提供就会导致jar包异常。

因此需要一款能够将项目所依赖的jar包 一并打入到jar中的插件来解决这些问题。

pom.xml中加入如下内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

效果演示:

  1. 不使用打包插件,直接对前面创建的工程C进行打包。

    image-20230703215901961

    这个时候工程C的大小只有2.3KB

  2. 使用打包插件进行打包。

image-20230703220030574

这个时候可以看到在C工程下有两个jar包。

其中文件名中包含-with-dependencies内容的是包含依赖的打包结果,查看其大小情况如下。

image-20230703220144397

可以看到该jar包大小有5.43M

-------------本文结束感谢您的阅读-------------