30

一次打包引发的思考,原来maven还可以这么玩~

 3 years ago
source link: https://chenjiabing666.github.io/2020/11/08/一次打包引发的思考,原来maven还可以这么玩/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

昨天有一个读者找我的交流工作心得,偶然间提到一个有趣的问题,如下:

大致的意思:公司最近在整 多模块 开发,由于模块之间相互依赖,每次打包都很烦,必须根据依赖关系逐一进行打包,有没有省事的办法呢?

其实玩转 Maven 的朋友都知道,只需要一条命令即可解决问题。

依赖关系

假设有一个多模块项目,父工程 P 中含有三个子模块 ABC ,三个模块有如下的依赖关系:

  1. A 依赖 BC
  2. B 依赖 C

FBV3Un.png!mobile

父工程 Ppom.xml 如下:

.....
<modules>
  <module>A</module>
  <module>B</module>
  <module>C</module>
</modules>
.....

A 模块的 pom.xml 如下:

....
<dependency>
  <groupId>xxx.xxxx</groupId>
  <artifactId>B</artifactId>
  <version>xxxx</version>
</dependency>
.....

B 模块的 pom.xml 如下:

....
<dependency>
  <groupId>xxx.xxxx</groupId>
  <artifactId>C</artifactId>
  <version>xxxx</version>
</dependency>
.....

C 模块的 pom.xml 如下:

....

你会怎么做?

现在产品需要上线项目 A ,你该如何打包?

最容易想到的则是分开打包,分别执行如下的命令:

mvn clean install C
mvn clean install B
mvn clean package A

以上三个模块轮流打包,至少需要五分钟以上吧,你不慌吗?

Fn2Qr2a.jpg!mobile

重点来了,我只需要如下一条命令即可打包完成:

mvn clean package -pl A -am -P test -DskipTests=true

以上命令有什么高深的吗? -P 指定环境, -DskipTests=true 跳过测试,但是 -pl-am 是什么?

答案肯定是在 -pl-am 这两个参数了。

必知的几个参数

从以上的例子中可以知道重要的就是 -pl-am 这两个参数,那么是什么意思呢?如下:

| 参数 | 说明 |

| — | — |

| -pl | 可选,指定需要处理的工程,多个使用英文逗号分隔,取值是 artifactId |

| -am | 可选,同时处理 pl参数 指定模块的依赖模块 |

| -amd | 可选,同时处理依赖于 pl参数 指定模块的模块 |

| -N | 可选,表示不递归子模块 |

怎么样,理解了吗?是不是有点晦涩难懂,哈哈….

aaYviue.jpg!mobile

别着急,下面通过几个命令理解一下(全部在父工程 P 的根目录下执行)。

  1. mvn clean install -pl A -am

对父工程 P 、子模块 A 以及 A 模块依赖的 BC 模块执行 mvn clean install 操作。

这个命令执行成功后,可以看到 PABC 四个模块全部安装到本地了。

  1. mvn clean install -pl C -am

对父工程 P 、子模块 C 模块执行 mvn clean install 操作。

这个命令执行成功后,可以看到 PC 两个模块安装到本地。

由于 C 模块 不依赖 其他的两个子模块,因此 AB 模块不会执行相关命令。

  1. mvn clean install -pl C -amd

对父工程 P 、子模块 C 以及依赖于 C 模块的B C 模块执行 mvn clean install`操作。

这个命令执行成功后,可以看到 PABC 四个模块全部安装到本地了。

  1. mvn clean install -N

只会打包父工程 P ,它的子模块将不会执行相关操作。

怎么样?通过以上的命令应该理解了吧。

总结

随着项目的体量逐渐增长,可不止上面的几个模块,学会以上几个命令,提升的效率可不止一倍啊。

另外作者的第一本 PDF 书籍已经整理好了,由浅入深的详细介绍了 Mybatis 基础以及底层源码,有需要的朋友公众号回复关键词 Mybatis进阶 即可获取,目录如下:

re2ARbv.png!mobile

q6ZVRzU.png!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK