最近研究 sofa-ark 的插件机制时,发现当执行完 maven clean install -DskipTests
时,打在 target 目录下的 xxx.jar
与安装到本地仓库的 xxx.jar
大小不一致。git
target 目录下的插件大小 github
.m2 下的插件大小socket
其实一开始看到这种现象也是懵逼,同一个工程,同一次命令执行,可是获得的两个 jar 包大小差距巨大。那么对于这种问题,我想到的有两点:maven
这里须要借助 IDEA 中的远程 debug 能力来完成。目前有两个工程,一个是咱们的主工程,工程名为上面截图中的 mq-client-ark-plugin ,另外一个是打包插件的源码工程,以下图所示:ide
那么下面就一步一步来完成远程 debug
的配置。工具
在主工程 mq-client-ark-plugin
的根目录下执行 mvnDebug install
(固然除了 install
以外,也能够是 compile
、package
、test
、deploy
等)。idea
当执行完 mvnDebug install
后,能够看到这个阻塞监听 8000 端口了。插件
在 idea
主界面找下下图的工具菜单,选择 Edit Configurations...
debug
+
选择
Remote
Host
: 远程目标主机地址,由于以前 主工程也是本地启动的,因此这里就是 localhost
Port
: 远程目标主机开启的远程 debug
端口debug
参数:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000
配置完成以后,执行 debug
,能够看下已经链接到了目标机器:3d
在来看主工程这里,在源码工程没有执行上面的 debug
按钮以前,一直都是阻塞的,执行以后 maven
执行的生命周期开始了:
如上图,由于在源码工程中打了断点,因此当执行到 sofa-ark-maven-plugin
插件时阻塞了。
上面已经搞定了对目标插件源码的 debug
模式的开启,那么下面就是对插件代码进行 debug
操做。节省篇幅,这里直接将断点放在目标代码行位置:
分析这段代码
Artifact
,此时 Artifact
的 file
为:
File
artifact
若是单从上面 debug
来看,其实很难解释开篇的那个问题。那么这里在回过头来看下 主工程的 maven
执行日志:
如上图中圈红的部分,表明 maven install
所经历的全部阶段。能够看到 sofa-ark-plugin-maven-plugin
是在 maven-install-plugin
后面,那这意味着什么呢?
咱们知道在 target 目录下获得的 xxx.jar 是打包阶段的产物,而 .m2 下面的是 install 的产物。
固然这里没有涉及到
deploy
,deploy
是install
以后的操做,好比发布到远程仓库。
如今再来看,由于 sofa-ark-plugin-maven-plugin
在执行 install
插件以前将 目标文件给替换了,因此致使打包生成的 target
目录下的 xxx.jar
和 安装到本地仓库的 xxx.jar
不一致。
本文记录了平常的一个问题排查过程,包括两个小点,一个是如何去 debug maven 的插件,另一个是简单了解下 maven 打包的生命周期。
关于 maven 打包的生命周期的代码没有具体研究过,不过这里能够大概猜想下,就是 maven 在执行命令时,有个相似于中央控制器的东西,经过解析 maven 命令获得一个 LifeCycle 或者 一个 Pipeline (LifeCycle 或者 Pipeline 实际上就是组装了一系列的插件)。而后 LifeCycle 或者 Pipeline 启动执行,遍历插件,依次执行插件的 execute 方法。