「曹工杂谈」Maven源码调试工程搭建
Maven源码调试工程搭建思路
我们前面的文章《【曹工杂谈】Maven和Tomcat能有啥联系呢,都穿打补丁的衣服吗》分析了Maven大要的执行阶段,主要包括三个阶段:
[*]启动类阶段,负责加载框架;
[*]框架焦点(maven core)阶段,主要负责根据参数中的goal,如clean,找到对应的插件的jar包,生成插件对象,剖析参数并调用插件代码;
[*]插件执行阶段,执行完成后,控制权会交还给框架焦点,由maven core完成善后工作。
这三个阶段,分别会去不同的地方加载对应的jar包。
https://p9.toutiaoimg.com/large/pgc-image/e276a6d6e4954e53ae966629bae9b56f
大概相识了这个流程后,我们开始思考,我们到底要调试哪一部门的代码。
[*]如果我们要调试阶段一的代码,那么,又分两种环境,是否需要改动阶段一的代码,如果需要改动,那么,就要找到阶段一的jar的源码,然后加载到idea中,并且,启动调试的时候,也需把classpath指定到我们的源码工程;如果不需要改动,那就可以参考:《【曹工杂谈】详解Maven插件调试方法》,直接把jar包引入idea的project classpath即可。
[*]如果我们需要调试阶段二的代码,那么,也分两种环境,需要改动代码,就去找源码,然后引入到idea;同时,阶段一去找阶段二的时候,默认还是去了%MAVEN_HOME%/lib/*.jar下边去找,我们这时候就得纠正它的错误行为,让它转而去我们的源码工程下找阶段二的代码。
[*]如果需要调试阶段三的代码,如果需要改动,默认也是要引入插件的源码工程;但是,阶段二,去找插件代码的时候,要让它去我们的源码工程下找代码是比较困难的(默认就是去当地堆栈找,要纠正这个行为,难度较大),因此,就算了。我们还是会引入插件的源码,但是,每次改了插件代码,手动部署到当地堆栈就行。
我们接下来,就开始实现上面的三个目标。
搭建阶段三的调试工程
大部门人可能感兴趣的还是插件代码,想自己搭着玩的,可以参考:《【曹工杂谈】详解Maven插件调试方法》
但是在这里,我还是需要基于我在gitee上新建的一个堆栈,来给大家讲解。后续的源码分析文章(如果有的话)也会基于这个工程来讲解。
代码在这里:https://gitee.com/ckl111/maven-3.8.1-source-learn
下边介绍下目次结构:
[*]test-maven-core,用来在这个module的pom上,执行mvn clean等下令
[*]plugin-sources,用来存放插件的代码,后续的插件源码都会往这里放
[*]plexus-classworlds-source,用来存放阶段一的谁人启动类的源码
[*]除此之外,都是maven框架自己的源码,这部门,统称为maven core
https://p9.toutiaoimg.com/large/pgc-image/d47632f932ee4415ad8826ac17bc4a85
下载了源码后,举行idea导入,导入时,选择这个主目次下的pom,这个pom,就是框架焦点的pom,默认只会导入框架焦点的maven工程;我们还需要手动,把test-maven-core、plugin-sources、plexus-classworlds-source都导入一下(对着pom右键,Mark As Maven Project即可)。
https://p6.toutiaoimg.com/large/pgc-image/eb98be21d7c64ea289bc63faae35c4be
导入完成后,我们默认会有4个root maven工程,此中,最上面的谁人Apache Maven,就是maven焦点框架。
https://p6.toutiaoimg.com/large/pgc-image/92ca4dd7aeea4f0994723757d837af02
接下来,也简单了,如果不需要修改代码的话,那就可以在恣意位置打断点了。打完断点,怎么触发呢, 下边这样就行了。
https://p6.toutiaoimg.com/large/pgc-image/b844ba05ff35448881fff5b2f35e12f5
我这边已经ok了,你呢?
https://p3.toutiaoimg.com/large/pgc-image/1f0d33acb1074e4ab951517f37be1f4d
如果想修改插件代码,改完后,记得mvn install插件到当地堆栈。
搭建阶段二的调试工程
如果大家只是想跟着代码debug,那么,直接在maven框架对应的类上打断点就行了,下图就是在maven core这个module上打断点。
https://p3.toutiaoimg.com/large/pgc-image/66b401c845a1486bb111e3753d22949e
如果可能自己想改改maven源码、辅助学习的话,我们就得动点心思。
在此之前,我们需要把整个maven框架焦点,先编译一次,因此,在G:\gitee-projects\maven-3.8.1-source-learn(只是我这边的目次)下,执行:
mvn -DskipTests=true install
如果大家有报错,什么rat相关的,可以来这里:
https://p26.toutiaoimg.com/large/pgc-image/2c8ef5e88dfe4676b85d06fecd9e3e87
把这个插件元素(元素)删掉。
我这边还遇到了checkstyle报错,同样,也在这个pom里,把checkstyle检查删掉。
最终呢,还是执行ok了。
https://p6.toutiaoimg.com/large/pgc-image/ababb105193e4661840053e297a7e713
上面这步ok后,在昨天的文章里《【曹工杂谈】Maven和Tomcat能有啥联系呢,都穿打补丁的衣服吗》,我们说了,maven的启动类,是去下边这个地方,找maven core代码的:
F:\tools\apache-maven-3.8.1-bin\apache-maven-3.8.1\bin\m2.conf.
文件内容原本是这样的:
main is org.apache.maven.cli.MavenCli from plexus.coreset maven.conf default ${maven.home}/confload ${maven.conf}/loggingoptionally ${maven.home}/lib/ext/*.jarload ${maven.home}/lib/*.jar此中,load ${maven.home}/lib/*.jar就加载了maven的焦点框架jar。这个地方,我们得改改,让它还得去我们idea中源码工程下加载class。
main is org.apache.maven.cli.MavenCli from plexus.coreset maven.conf default ${maven.home}/confload ${maven.conf}/loggingoptionally ${maven.home}/lib/ext/*.jarload G:\gitee-projects\maven-3.8.1-source-learn\maven-artifact\target\classesload G:\gitee-projects\maven-3.8.1-source-learn\maven-builder-support\target\classesload G:\gitee-projects\maven-3.8.1-source-learn\maven-compat\target\classesload G:\gitee-projects\maven-3.8.1-source-learn\maven-core\target\classesload G:\gitee-projects\maven-3.8.1-source-learn\maven-embedder\target\classesload G:\gitee-projects\maven-3.8.1-source-learn\maven-model\target\classesload G:\gitee-projects\maven-3.8.1-source-learn\maven-model-builder\target\classesload G:\gitee-projects\maven-3.8.1-source-learn\maven-plugin-api\target\classesload G:\gitee-projects\maven-3.8.1-source-learn\maven-repository-metadata\target\classesload G:\gitee-projects\maven-3.8.1-source-learn\maven-resolver-provider\target\classesload G:\gitee-projects\maven-3.8.1-source-learn\maven-settings\target\classesload G:\gitee-projects\maven-3.8.1-source-learn\maven-settings-builder\target\classesload G:\gitee-projects\maven-3.8.1-source-learn\maven-slf4j-provider\target\classesload ${maven.home}/lib/*.jar也就是去我们得target下加载classes。
这样呢,我们就可以改动我们idea里导入的maven 焦点框架的代码,然后compile了,compile后,class进入到对应的target目次下,恰好就在上文的m2.conf里的路径中。
为了验证是否见效,我们随便在maven焦点框架打了个断点,看看当前类的类加载器的路径,发现确实已经ok了。
https://p3.toutiaoimg.com/large/pgc-image/55cad4d5b7a4489babe9108a677f5f5e
搭建阶段一的调试工程
阶段一,也就是谁人启动jar包,对应的源码在:
https://p5.toutiaoimg.com/large/pgc-image/fbc0d6bebc614b1d8cca66fac6d05b2b
我们只需要在启动测试工程里,把classpath指向这里的target目次,而不是maven安装目次下的plexus-classworlds-2.6.0.jar就可以了。
https://p5.toutiaoimg.com/large/pgc-image/4b6911405fc04d4ebeaab692ea4a2d88
我们把这段复制出来,然后把此中,指向jar包的替换掉:
-classpath "G:\gitee-projects\maven-3.8.1-source-learn\target;F:\tools\apache-maven-3.8.1-bin\apache-maven-3.8.1\boot\plexus-classworlds.license;C:\Program Files\JetBrains\IntelliJ IDEA 2021.1.1\lib\idea_rt.jar"把这段贴到maven执行的参数中即可。
https://p6.toutiaoimg.com/large/pgc-image/436603f0ad3145bd959fb063a9e1d281
总结
汇总一下:
[*]阶段一,指定classpath来调试我们的源码工程:
-classpath "G:\gitee-projects\maven-3.8.1-source-learn\target;F:\tools\apache-maven-3.8.1-bin\apache-maven-3.8.1\boot\plexus-classworlds.license;C:\Program Files\JetBrains\IntelliJ IDEA 2021.1.1\lib\idea_rt.jar"
[*]阶段二,框架焦点阶段,通过修改maven安装目次下的m2.conf的内容来实现
[*]阶段三,插件源码阶段,修改源码后,通过编译部署到当地堆栈后实现
我是逐日, 深圳腾讯打工人,成都深圳两地反复横跳的后端java步伐猿一枚. 之前在深圳3年,后来去了成都4年,现在又来了深圳,也开始写写前端,有需要内推的可以找我。对于一线编码实战、网络、数据库、高并发等有浓厚兴趣。
也接待加我,拉进技术群一起交流;腾讯内推也可以找我。
https://p6.toutiaoimg.com/large/pgc-image/4a0048c486e243009f303e21f344e2ee
本文由博客一文多发平台 OpenWrite 发布!
页:
[1]