一次打包引发的思考,原来maven还能这么玩?
持续原创输出,点击上方蓝字关注我

目录
前言 依赖关系 你会怎么做? 必知的几个参数 总结
前言
昨天有一个读者找我的交流工作心得,偶然间提到一个有趣的问题,如下:
「大致的意思」:公司最近在整多模块
开发,由于模块之间相互依赖,每次打包都很烦,必须根据依赖关系逐一进行打包,有没有省事的办法呢?
其实玩转Maven
的朋友都知道,只需要一条命令即可解决问题。
依赖关系
假设有一个多模块项目,父工程P
中含有三个子模块A
、B
、C
,三个模块有如下的依赖关系:
A
依赖B
、C
。B
依赖C
。

父工程P
的pom.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
以上三个模块轮流打包,至少需要五分钟以上吧,你不慌吗?

重点来了,我只需要如下一条命令即可打包完成:
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 | 可选,表示不递归子模块 |
怎么样,理解了吗?是不是有点晦涩难懂,哈哈....

别着急,下面通过几个命令理解一下(全部在父工程P
的根目录下执行)。
mvn clean install -pl A -am
对父工程P
、子模块A
以及A
模块依赖的B
、C
模块执行mvn clean install
操作。
这个命令执行成功后,可以看到P
、A
、B
、C
四个模块全部安装到本地了。
mvn clean install -pl C -am
对父工程P
、子模块C
模块执行mvn clean install
操作。
这个命令执行成功后,可以看到P
、C
两个模块安装到本地。
由于
C
模块「不依赖」其他的两个子模块,因此A
、B
模块不会执行相关命令。
mvn clean install -pl C -amd
对父工程P
、子模块C
以及依赖于C
模块的B、
C模块执行
mvn clean install`操作。
这个命令执行成功后,可以看到P
、A
、B
、C
四个模块全部安装到本地了。
mvn clean install -N
只会打包父工程P
,它的子模块将不会执行相关操作。
怎么样?通过以上的命令应该理解了吧。
总结
随着项目的体量逐渐增长,可不止上面的几个模块,学会以上几个命令,提升的效率可不止一倍啊。

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?