继承
基本概念
假如有这样一个场景,我们的项目现在有三个子Maven工程(A、B和C),如果3个工程都需要使用到同一个Jar包,那么我们在打包项目的时候就需要将这三个工程中用到的相同包的版本进行统一,那么按照之前的做法就需要去到每一个工程中手动修改3个工程共用的Jar包为同一个版本,这个做法无疑是非常不可取的,如果子项目较多,出现依赖交叉的情况也会越多,这样工作量是非常大的。
使用继承机制就可以将这样的依赖信息统一提取到父工程模块中进行统一管理。
效果演示
为了演示继承的效果,在此首先新建立两个Maven工程Parent和Child。
对于父工程的pom(Parent).xml文件需要做以下配置。
修改打包方式为
pom
在
<dependencies></dependencies>标签外部添加<dependencyManagement></dependencyManagement>标签。并在<dependencies></dependencies>内部指定依赖及其版本。
对于子工程的pom(Child).xml文件做以下配置,使其继承父工程的依赖。
设置
<Parent></Parent>标签,并在标签内部指定父工程坐标和配置文件的相对路径。
在子工程中添加依赖包的坐标(省略版本号和可见性)

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

可以看到子工程中只有一个junit并且其版本就是我们在父工程中指定的4.9。
删除父工程中的<dependencyManagement>
<dependencyManagement></dependencyManagement>标签的作用是,不直接将父工程中所有的依赖全部传给子工程,而且让子工程有需要的时候在依赖中指定坐标并省略版本号和可见范围。
如果不写该标签,那么默认就是将所有的依赖给到继承自父工程的所有子工程。
pom(Parent).xml

pom(Child).xml

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

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

pom(A2).xml

pom(A3).xml

效果演示如下:
- 直接打包工程
A1发现打包失败

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

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

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

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

我们发现我们要想打包某个Maven工程,必须提前知道该工程的所有依赖和依赖关系,才可导入成功。使用聚合操作就可以让Maven自动帮我们按照顺序加载依赖并进行打包。
要使用聚合功能,需要使用到<modules></modules>标签。
例如修改A1工程中的配置文件如下:

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

可以看到,我们在写<modules></modules>标签中的内容时,特地将A2写在前面,对A1进行打包时,他会自动识别需要先打包A3,再打包A2。这就是聚合操作的一个特点。
Maven库站
可以该网站https://mvnrepository.com/搜索你想要的jar包的依赖信息。
例如在该网站中搜索mysql,那么他会自动的帮你找到mysql的jar包驱动。

并且有各种版本的jar包信息。
点击其中一个后,在网页中会自动给出对应的依赖包坐标。

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

Maven生成环境问题解决
在使用maven过程中,我们所使用的jar包是会到中央仓库中进行下载的,但是如果再下载过程中因为网络不通畅等原因,会导致jar包下载失败,并且会形成一个xxxx.lastupdated的文件,但是此时maven并不会将其删掉后重新下载,而是认为它下载过了,我们需要做的是将.xxxxlastupdated文件手动删除后,再次重新下载。
Maven打包插件
Maven本身的打包插件不负责将依赖的jar包一并打入到jar包中。那么就会导致一个问题,如果某个项目的jar包依赖在服务器中提供则不会有问题,万一不提供就会导致jar包异常。
因此需要一款能够将项目所依赖的jar包 一并打入到jar中的插件来解决这些问题。
在pom.xml中加入如下内容。
1 | <build> |
效果演示:
不使用打包插件,直接对前面创建的工程
C进行打包。
这个时候工程
C的大小只有2.3KB。使用打包插件进行打包。

这个时候可以看到在C工程下有两个jar包。
其中文件名中包含-with-dependencies内容的是包含依赖的打包结果,查看其大小情况如下。

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