一个 maven 插件打包问题的排查

最近研究 sofa-ark 的插件机制时,发现当执行完 maven clean install -DskipTests 时,打在 target 目录下的 xxx.jar 与安装到本地仓库的 xxx.jar 大小不一致。git

  • target 目录下的插件大小 github

  • .m2 下的插件大小socket

其实一开始看到这种现象也是懵逼,同一个工程,同一次命令执行,可是获得的两个 jar 包大小差距巨大。那么对于这种问题,我想到的有两点:maven

  • debug 打包插件执行过程
  • 了解 maven 插件的生命周期

debug 打包插件执行过程

这里须要借助 IDEA 中的远程 debug 能力来完成。目前有两个工程,一个是咱们的主工程,工程名为上面截图中的 mq-client-ark-plugin ,另外一个是打包插件的源码工程,以下图所示:ide

那么下面就一步一步来完成远程 debug 的配置。工具

一、使用 mvnDebug 命令开启 debug 模式

在主工程 mq-client-ark-plugin 的根目录下执行 mvnDebug install(固然除了 install 以外,也能够是 compilepackagetestdeploy 等)。idea

当执行完 mvnDebug install 后,能够看到这个阻塞监听 8000 端口了。插件

二、源码工程配置远程 debug

idea 主界面找下下图的工具菜单,选择 Edit Configurations... debug

打开配置面板以后,左上角 + 选择 Remote
填写相关远程 debug 参数

  • Host : 远程目标主机地址,由于以前 主工程也是本地启动的,因此这里就是 localhost
  • Port : 远程目标主机开启的远程 debug 端口
  • 开启远程 debug 参数:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

配置完成以后,执行 debug ,能够看下已经链接到了目标机器:3d

在来看主工程这里,在源码工程没有执行上面的 debug 按钮以前,一直都是阻塞的,执行以后 maven 执行的生命周期开始了:

如上图,由于在源码工程中打了断点,因此当执行到 sofa-ark-maven-plugin 插件时阻塞了。

从 maven 执行的生命周期找出问题根源

上面已经搞定了对目标插件源码的 debug 模式的开启,那么下面就是对插件代码进行 debug 操做。节省篇幅,这里直接将断点放在目标代码行位置:

分析这段代码

  • 一、获取到项目的 Artifact ,此时 Artifactfile 为:
  • 二、从新设置的 File
  • 三、从新设置了 artifact

若是单从上面 debug 来看,其实很难解释开篇的那个问题。那么这里在回过头来看下 主工程的 maven 执行日志:

如上图中圈红的部分,表明 maven install 所经历的全部阶段。能够看到 sofa-ark-plugin-maven-plugin 是在 maven-install-plugin 后面,那这意味着什么呢?

咱们知道在 target 目录下获得的 xxx.jar 是打包阶段的产物,而 .m2 下面的是 install 的产物。

固然这里没有涉及到 deploydeployinstall 以后的操做,好比发布到远程仓库。

如今再来看,由于 sofa-ark-plugin-maven-plugin 在执行 install 插件以前将 目标文件给替换了,因此致使打包生成的 target 目录下的 xxx.jar 和 安装到本地仓库的 xxx.jar 不一致。

小结

本文记录了平常的一个问题排查过程,包括两个小点,一个是如何去 debug maven 的插件,另一个是简单了解下 maven 打包的生命周期。

关于 maven 打包的生命周期的代码没有具体研究过,不过这里能够大概猜想下,就是 maven 在执行命令时,有个相似于中央控制器的东西,经过解析 maven 命令获得一个 LifeCycle 或者 一个 Pipeline (LifeCycle 或者 Pipeline 实际上就是组装了一系列的插件)。而后 LifeCycle 或者 Pipeline 启动执行,遍历插件,依次执行插件的 execute 方法。

相关文章
相关标签/搜索