Maven源码调试项目构建思路我们之前的文章《【曹工杂谈】Maven和Tomcat能有啥联系呢,都穿打补丁的衣服吗》分析了Maven的一般执行阶段,主要包括三个阶段:启动类阶段,负责加载框架;框架核心(mavencore)阶段主要负责根据参数中的目标找到对应的插件jar包,如clean,生成插件对象,解析参数,调用插件代码;在插件执行阶段,执行完成后,会将控制权交还给框架核心,善后工作由maven核心完成。这三个阶段会去不同的地方加载对应的jar包。大致了解了流程后,我们开始思考要调试哪部分代码。如果我们要调试stage1的代码,那么有两种情况,是否需要改stage1的代码,如果需要改,那么就要找到stage1的jar的源码,然后加载到idea中,开始调试的时候,还需要指定classpath到我们的源码工程;如果不需要修改,可以参考:《【曹工杂谈】详解Maven插件调试方法》,将jar包导入idea的工程类路径即可。如果我们需要调试阶段2的代码,那么有两种情况。如果我们需要更改代码,我们可以找到源代码,然后将其导入到idea中;同时,我们在phase1去到phase2的时候,默认是去到%MAVEN_HOME%/lib/*.jar,此时我们要纠正它的错误行为,让它去到我们的源码中项目找到第二阶段的代码。如果需要调试阶段3的代码,如果需要修改,默认导入插件的源码工程;但是在Phase2的时候,在找插件代码的时候,比较难让它去我们的源码项目中找代码(默认就是去本地仓库找。更难改正这种行为),所以算了吧。我们还是会介绍插件的源码,但是插件代码每次改动,都可以手动部署到本地仓库。接下来,我们就开始实现以上三个目标。大多数人可能对第三阶段建设的调试项目的插件代码感兴趣。如果你想自己玩玩,可以参考:《【曹工杂谈】详解Maven插件调试方法》不过在这里,我还是要基于我在giteeexplain上新建的一个仓库分享给大家。后续的源码分析文章(如有)也将基于该项目进行讲解。代码在这里:https://gitee.com/ckl111/mave...目录结构介绍如下:test-maven-core,用于在本模块plugin-sources的pom上执行mvnclean等命令,用于存放插件的代码,后续的插件源码会放在这里plexus-classworlds-source,用于存放stage1启动类的源码。另外,maven框架本身的源代码。这部分统称为mavencore下载源码后导入idea。导入的时候选择主目录下的pom。这个pom是框架的核心pom。默认只会导入框架核心的maven项目;我们还需要手动导入test-maven-core,plugin-sources和plexus-classworlds-source都导入了(右键单击pom,MarkAsMavenProject)。导入完成后,我们默认会有4个根maven项目,其中最上面的ApacheMaven是核心maven框架。接下来,也简单了。如果不需要修改代码,可以在任意位置打断点。打到断点后,如何触发,就照下面的做。我在这里很好,你呢?如果要修改插件代码,记得修改后mvninstall插件到本地仓库。如果只是想跟着代码调试第二阶段的调试项目,那么直接在maven框架对应的类上打断点即可。下图是maven核心模块上的断点。如果可以改maven源码,辅助学习,我们不得不考虑一下。在此之前,我们需要先编译整个mavenframeworkcore,所以,在G:\gitee-projects\maven-3.8.1-source-learn(就是我的目录),执行:mvn-DskipTests=trueinstall如果你有报错,跟rat有什么关系,可以来这里:删除这个插件元素(元素)。我这里也遇到了checkstyle报错。同样,在这个pom中,删除checkstyle检查。最后执行ok了。以上步骤ok之后,在昨天的文章《【曹工杂谈】Maven和Tomcat能有啥联系呢,都穿打补丁的衣服吗》中,我们说了maven启动类是到下面这个地方找到maven核心代码:F:\tools\apache-maven-3.8.1-bin\阿帕奇-maven-3.8.1\bin\m2.conf。文件的原始内容是这样的:mainisorg.apache.maven.cli.MavenClifromplexus.coresetmaven.confdefault${maven.home}/conf[plexus.core]load${maven.conf}/loggingoptionally${maven.home}/lib/ext/*.jarload${maven.home}/lib/*.jarwhere,load${maven.home}/lib/*.jar加载maven的核心框架jar.这个地方我们得改一下,让它得去我们idea中的源码工程去加载类。主要是org.apache.maven.cli.MavenCli来自plexus.coresetmaven.conf默认${maven.home}/conf[plexus.core]load${maven.conf}/logging可选${maven.home}/lib/ext/*.jarloadG:\gitee-projects\maven-3.8.1-source-learn\maven-artifact\target\classesloadG:\gitee-projects\maven-3.8.1-source-learn\maven-builder-support\target\classesloadG:\gitee-projects\maven-3.8.1-source-learn\maven-compat\target\classesloadG:\gitee-projects\maven-3.8.1-source-learn\maven-core\target\classesloadG:\gitee-projects\maven-3.8.1-source-learn\maven-embedder\target\classesloadG:\gitee-projects\maven-3.8.1-source-learn\maven-model\target\classesloadG:\gitee-projects\maven-3.8.1-source-learn\maven-model-builder\target\classesloadG:\gitee-projects\maven-3.8.1-source-learn\maven-plugin-api\target\classesloadG:\gitee-projects\maven-3.8.1-source-learn\maven-repository-metadata\target\classesloadG:\gitee-projects\maven-3.8.1-source-learn\maven-resolver-provider\target\classesloadG:\gitee-projects\maven-3.8.1-source-learn\maven-settings\target\classesloadG:\gitee-projects\maven-3.8.1-source-learn\maven-settings-builder\target\classesloadG:\gitee-projects\maven-3.8.1-source-learn\maven-slf4j-provider\target\classesload${maven.home}/lib/*.jar就是去我们的target加载类。这样我们就可以把idea中导入的maven核心框架的代码改一下,然后编译。编译后类进入对应的target目录,就在上面m2.conf中的路径中。为了验证是否有效,我们在maven核心框架中随机打了一个断点,查看当前类的类加载器的路径,发现确实可以。构建阶段1的调试项目阶段1,即启动jar包,对应的源码为:我们在启动测试项目中只需要将classpath指向这里的目标目录,而不是plexus-classworlds-2.6在maven安装目录下.0.jar就可以了。我们把这一段复制过来,然后替换成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:\ProgramFiles\JetBrains\IntelliJIDEA2021.1.1\lib\idea_rt.jar》将这段粘贴到maven执行的参数中即可。总结一下:第一阶段,指定类路径来调试我们的源代码项目:-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:\ProgramFiles\JetBrains\IntelliJIDEA2021.1.1\lib\idea_rt.jar》第2阶段,framework核心阶段,修改maven安装的目录下m2.conf内容用于实现第三阶段,插件源码阶段,修改源码后编译部署到本地仓库,实现我是一个后端java程序每天反复往返于深圳和深圳之间殴打工人。袁一梅。我在深圳3年,然后去了成都4年。现在又来深圳了,也开始写写前端了。如果需要推广,可以联系我。对一线编码实践、网络、数据库、高并发等有浓厚兴趣,也欢迎大家加我,拉进技术群一起交流;也可以在腾讯内推找到我。本文由博客多发平台OpenWrite发布!