为什么需要在本地编译源码

我们在看框架源码的时候,如果没有注释,看起来会比较吃力。所以如果能够一边看源码一边自己加中文注释,下次阅读的时候就会轻松很多。

问题是:通过maven下载的jar,查看源码,实际上看到的是经过反编译的class文件,是不能够修改的(提示:file is read only)。

如果把当前maven下载的jar包强行关联到自己下载的源码,又有可能会出现字节码跟源码文件不一致的情况(提示:Library source does not match the bytecode for class),导致debug的时候无法进入代码。

如果要保证源码和字节码一致,最好的办法当然是在本地把下载的源码编译生成jar包,上传到本地maven仓库,再引用这个jar。

配置MAVEN

因为需要用Maven打包编译源代码,所以第一步是检查Maven的配置。确保mvn命令可以使用。

这一步大家自行搜索。

手动编译源码

为了方便我们在看源码的过程中能够方便的添加注释,我们可以自己来从官网下载源码编译生成对应的Jar包,然后上传到本地maven仓库,再引用这个Jar。大家可以自行去官网下载:

因为MyBatis源码编译依赖parent项目的源码,所以第一步是编译parent项目。

git clone https://github.com/mybatis/parent
git clone https://github.com/mybatis/mybatis-3

打开mybatis-3中的pom.xml文件,查看parent的版本号,例如:

  <parent><groupId>org.mybatis</groupId><artifactId>mybatis-parent</artifactId><version>31</version><relativePath /></parent>

确定parent版本是31(记住这个数字)。

把mybatis版本号改成自定义的版本号,避免跟官方版本号冲突(加上了-chen):

<artifactId>mybatis</artifactId>
<version>3.5.8-chen</version>
<packaging>jar</packaging>

进入parent目录,切换项目分支(不能在默认的master分支中编译),工程名后面的数字就是前面看到的parent版本号。

开始编译parent项目:在parent项目中打开 git bash

git checkout mybatis-parent-31mvn install

接下来编译mybatis工程,进入mybatis-3目录,切换到3.5.4分支(任意分支,但是不能在默认的master分支中编译)。

cd ../mybatis-3git checkout mybatis-3.5.4mvn cleanmvn install -DskipTests=true -Dmaven.test.skip=true -Dlicense.skip=true


这样我们在本地仓库就可以看到我们编译好的源码了。jar包的名字是由于我在pom文件中写成3.5.8了…

关联JAR包到源码

我们本地编译好了源码,这时我们就可以在我们的项目中来使用源码了。首先依赖要改变下:

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.8-chen</version>
</dependency>

然后修改配置 Project Structure —— Libries —— Maven: org.mybatis:mybatis:3.5.8-chen ——在原来的Sources上面点+(加号) —— 选择到下载的源码路径

添加注释

我们可以随意打开一个源码内部的类,比如BaseTypeHandler


接下来就可以开始我们的源码分析之旅了。

注意

  • 然后如果出现mybatis的相关源码查找不到等异常情况,就执行如下操作 File --> Invalidate Caches and Restart 重启IDE就可以了
  • 如果添加注释导致了debug的当前行跟实际行不一致,再把mybatis3工程编译一次即可。

MyBatis源码本地编译相关推荐

  1. 物联网ThingsBoard源码本地编译篇,超详细教程,小白看过来!

    编译准备 我用的是 IDEA2021 maven3.6.3 下载地址 Index of /dist/maven/maven-3/3.6.3/binaries (apache.org) jdk11.0. ...

  2. Windows:kibana 源码本地编译--v6.4.1

    1.预安装 nodejs 8.11.4 yarn latest版本 npm install -g yarn@1.7.0-全局安装yarn,高版本yarn容易报错 对应版本的es,本地安装的是6.4.1 ...

  3. Kettle源码本地编译运行

    1.开发环境准备 JDK1.8 Maven3.8.1 2.源码下载 官网下载 注意:下载后面有-R的包,这才是真正的源码 3.编译运行 本地Windows编译可能会遇到一些问题,基本网上搜搜都能解决, ...

  4. idea下编译mybatis源码

    前段时间笔者在专心研究Netty源码,Netty源码研究已经告一段落了.接下来就是开启我们的Mybaits源码的征程.首先我们要开始编译Mybatis源码. 下载源码 我们先去的GitHub上面找到对 ...

  5. mybatis源码编译出现问题

    1 mybatis-3 下载GitHub源码后  pom文件 <parent><groupId>org.mybatis</groupId><artifactI ...

  6. MyBatis源码-解读Executor的三个实现类之SimpleExecutor(简单执行器)

    文章目录 Pre Executor 执行器 接口继承关系 SimpleExecutor(简单执行器) 入门小demo 实例化SimpleExecutor doQuery方法 Pre MyBatis源码 ...

  7. MyBatis源码-深入理解MyBatis Executor的设计思想

    文章目录 Pre JDBC的执行过程 JDBC Demo JDBC Statement 接口 MyBatis执行过程 四大组件 组件之间的关系 Executor 执行器组件 架构总览 接口继承关系 P ...

  8. MyBatis 源码分析 - SQL 的执行过程

    本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程.该过程本身比较复杂,牵涉到的技术点比较多.包括但不限于 Mapper 接口代理类的生成.接口方法的解析.SQL 语句的解析.运 ...

  9. MyBatis 源码分析系列文章导读

    1.本文速览 本篇文章是我为接下来的 MyBatis 源码分析系列文章写的一个导读文章.本篇文章从 MyBatis 是什么(what),为什么要使用(why),以及如何使用(how)等三个角度进行了说 ...

  10. mybatis源码阅读(六) ---StatementHandler了解一下

    转载自  mybatis源码阅读(六) ---StatementHandler了解一下 StatementHandler类结构图与接口设计 BaseStatementHandler:一个抽象类,只是实 ...

最新文章

  1. Verilog如何避免Latch
  2. 2017尼毕鲁笔试算法题
  3. 超全超详细的HTTP状态码大全
  4. Permutation(构造+思维)
  5. mysql week统计_MySQL按周统计 WEEK 实例
  6. Go,11 岁生日快乐!
  7. c语言电子时钟设计报告,电子时钟设计实验报告.doc
  8. 战略分析思路——沙盘推演逻辑
  9. RGSSAD解密程序(基于RgssadUnpacker改进以支持RGSS3A)
  10. win10开机自动打开http://go.microsoft.com/fwlink/?LinkID=219472clcid=0x409
  11. 做软文营销发布有哪些常见平台?
  12. Java----线程学习(多线程)
  13. w7系统路由器虚拟服务器怎么设置方法,win7路由器怎么重新设置
  14. 区块链是什么意思?区块链的概念及特点
  15. 基于ZigBee的家居控制系统的设计与应用
  16. 10个程序员可以接私活的平台和一些建议!
  17. cannot be cast to javax.servlet.Servlet 解决
  18. codevs 2833 奇怪的梦境
  19. ESP8266,电脑作为TCP SERVER,8266发数据给电脑
  20. android 图片合成

热门文章

  1. linux车机carplay模块,卸甲科技UI2.0版本Linux车机发布
  2. 计算机一直黑屏,电脑开不了机 一直黑屏 电源灯亮着 在线等
  3. 离散数学第九章—学习笔记
  4. 三菱伺服驱动器说明书_干货——PLC控制伺服系统(伺服电机)
  5. centos7下安装zmap
  6. Jmeter连接测试Mysql数据库
  7. goeasy服务器发送(发布)消息,python服务端使用GoEasy实现websocket消息推送
  8. 如何把JSON对象转为map对象
  9. c语言中存储点分十进制IP地址
  10. 安全用电技能实训装置