继承
基本概念
假如有这样一个场景,我们的项目现在有三个子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
。