JDK1.8及Spring5.0.x源码环境搭建

源码阅读是程序员进阶必不可少的一环,对于源码的阅读我的建议是按需加载,日积月累,准备长期作战,就像数据结构和算法一样,刷题学习可能是一个需要长期坚持的事情,不仅仅是为了面试更是为了提升基本功。但是凡事不可急功近利,一口吃不成胖子,源码阅读在初期应该是先看自己工作中用到的一小部分,感兴趣或者有疑惑的一小部分,然后随着工作经验的增加,基础知识的夯实,再逐渐系统化学习。好的源码能给我们带来很多启发,也能让我们不仅是会用工具或框架,更能用好,能解决疑难。阅读源码需要一定的知识储备,比如设计模式,数据结构和算法,操作系统,计算机网络,甚至编译原理等等,同时需要在心里做一个长期规划,逐渐积累。本篇博客只是简单的源码环境搭建介绍,主要包括JDK1.8源码与Spring5.0.x源码搭建。

有问题可在本博客或者个人博客留言


为何要搭建源码阅读环境呢,最开始阅读源码的环境,对于JDK大部分人是直接点进去看,然后在外部另起文档做笔记,而Spring源码可能是直接下载好源码,然后本地点进去看源码然后加注释。可是这样有两个问题:既然阅读源码是一件长期需要的事情,那就需要在源码上加上自己的注释,把自己的理解备注好,同时搞个仓库保存起来。可是我们平时代码中依赖的JDK和Spring,源码都是只读的,不能加自己的注释,而下载的Spring源码码虽然能加注释,但是没有通过demo运行起来跟进去源码阅读,只是静态的点一点自己想看的类,然后一层层往下,虽然可以加注释,但是这样如果想验证代码执行流程是不方便的,只能参考博客或者自己摸索,这效率也太低了,所以需要搭建一个环境来方便自己能够边运行代码边加注释。

说来惭愧,没想到我之前认为简单的源码环境搭建,断断续续搞了三天。其中JDK源码环境搭建没有费多少时间,大概不到半小时,但是剩下的两天多时间,折腾Spring源码环境让我几近崩溃,搞下来的最大感受是第一有点吃内存,我的笔记本自从搭了Spring源码环境开起来IDEA就卡的不行,第二就是gradle版本匹配一定要正确,不然不兼容问题,反复下载依赖问题能让人崩溃。下面开始正文:

版本说明:JDK1.8+IDEA2020.2+SpringFramework5.0.x+Win10

JDK1.8源码阅读环境搭建

  • 在IDEA中新建一个maven项目,之后在项目下新建一个包,但是注意不要放在src包下,这样会导致编译的时候一起编译造成卡顿,比如我这里新建的包是relsource

  • 找到你安装jdk的路径也就是你电脑上配置的JAVA_HOME路径下的src.zip文件,拷贝到上一步新建的包所在路径下,然后解压,解压后删除原zip压缩包

    经过上面两步得到的IDEA项目树如图所示:

    测试

  • 接下来我们需要将我们项目依赖的jdk替换成我们导入的jdk源码,以下点击File-Project Structure-SDKs-Sourcepath,将项目中原本依赖的jdk包换成我们刚才导入relsource包下的jdk即可。

sdk

  • 经过上述步骤就完成了jdk源码环境的搭建,接下来在src下写个测试类,并在相关代码出打断点,看下我们进入的源码部分是否还是只读的。在写测试类之前,需要设置下debug时可以进入源码,设置方法如下:File-Settings-Build,Execution,Deployment-Stepping之后去掉Do not step into the classes前面的勾选项,如下图:

stepping

  • 我在src文件夹下新建了一个测试类FirstTest,内容如下:

    public class FirstTest {
        public static void main(String[] args) {
            ArrayList<String> list = new ArrayList<>();//此处打断点
            list.add("tom");
            list.add("amy");
            list.add("okr");
            System.out.println(list);
        }
    }
    

接下来在debug模式下,通过Step into(F7)就可以进入到源码,环境搭建完毕

jdkdebug

SpringFramework5.0.x 源码阅读环境搭建

准备工作

码云账号(可选)

Spring官方提供了源码的github地址,但是直接从github上面clone太慢,所以建议自己上gitee注册个账号,然后把仓库同步过来,网上也有别的博主公布了自己的gitee仓库地址,供不想注册gitee的同学去clone,但是我建议还是自己注册一个码云账号,首先这个事情不废时间,注册账号用手机很快注册好,然后同步代码我亲测用时七分钟整个仓库就同步过来了,其次后期你可能想看最新版本的代码,那gitee上别人的仓库不一定能很及时的同步,自己建一个账号随时可以同步新代码过来,这也是gitee方便的一个地方,当你第一次把仓库导入的时候,后面还可以实时同步最新代码,很方便

clone代码(必选)

在第一步基础上,通过IDEA去把代码从gitee上clone下来,这里注意最新版本的Spring framework源码依赖了jdk11的jar包,所以如果你的电脑上jdk版本低于11,clone下来后请不要直接选择master分支。我这边由于自己的电脑上安装的是jdk1.8,而且我的电脑会写工作代码,刚开始时我想将JDK版本升级到11,但是看到这两个版本还是有很多第三方jar包不同的地方,所以我没敢贸然升级,最终还是选择先试用5.0.x这个分支,只要jdk1.8就够了。

安装gradle(必选)
方法一:本地安装gradle

这一步一定要注意一点,你的gradle版本不要自己去搜索最新版本的安装,一定要按照你clone下来的代码中官方所用的版本来,具体到这里,在clone下来的代码对应分支的gradle包下,有一个gradle-wrapper.properties文件中的如下参数指定

distributionUrl=https\://services.gradle.org/distributions/gradle-4.4.1-bin.zip

我在这里就踩了坑,由于我刚clone下来代码使用的是master分支,对应的官方gradle版本是6.5.1,我就安装了gradle6.5.1版本,配置了环境变量,但是当我编译源码后发现各种报错,最后发现依赖了jdk11的包而我又暂时不想升级jdk版本的时候,我切换到了5.0.x版本,这个时候官方指定的gradle版本如上,是gradle-4.4.1-bin版本,我当时想这个应该没啥关系,高版本肯定兼容低版本嘛?谁知当我搞定一切其他问题的时候,最后总是报一些指令在当前版本gradle不支持什么的,我又重新装了4.4.1版本,而重新安装后,Spring依赖的相应jar包又会重新下载一次,我每次下载都需要两小时以上,所以来回浪费了好多时间。

方法二:坐享其成

如果你不想在自己本地手动安装gradle,那么你可以在clone导入源码的时候,IDEA会提示你下载gradle,这个时候下载的版本就和官方是一样的,所以你只要等他下载好就行,这个过程也是很耗时间的一个过程,虽然整个包只有70-100M多,但是下载速度实在太慢。

修改下载源镜像位置
修改单个项目的下载源

和maven一样,gradle也可以配置自己下载依赖jar包时首选的仓库地址,默认路径下载依赖构建项目比较慢,所以源码下载下来之后,我们首先进入到 build.gradle 文件中(就在最外层文件夹,项目树的下方),添加下载源(原有的保留,添加 Alibaba 下载源):

repositories {
		mavenCentral()
		maven { url "https://maven.aliyun.com/repository/public" }
		//...原有的保留
}
全局设置下载源

如果我们想让其他基于gradle编译打包的项目也使用上述镜像,我们需要在gradle包的路径下进行操作,默认的是在C盘用户目录下 user下面的.gradle ,需要在.gradle文件夹下,新建一个init.gradle文件,使用文本编辑器打开,输入以下文本

allprojects {
    repositories {
         maven {
             name "aliyunRepo"
             url "https://maven.aliyun.com/repository/public"
         }
    }
}
编译项目

依赖下载完成之后(我的依赖下载用时都在两小时以上,因为切换版本还反复下了好几次 😭😭😭)我们就可以通过Build->Build Project来编译项目了,编译之前建议取消勾选模块Spring-aspect,这个模块包含了一些其他依赖,可能导致报错。如果这一步编译过程你没报错,那么恭喜你距离搭建成功不远了。

添加测试类

在导入的Spring源码项目下,新建一个Module,我这边新建了一个mytest模块

test

之后在src.main.java包下新建一个包com.enjoyican,再新建一个User类:

public class User {
	private String username;
	private String address;

	@Override
	public String toString() {
		return "User{" +
				"username='" + username + '\'' +
				", address='" + address + '\'' +
				'}';
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}
}

然后在resources下建一个beans.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/Spring-beans.xsd">

	<bean class="com.enjoyican.User" id="user">
		<property name="username" value="enjoyican"/>
		<property name="address" value="www.enjoyican.com"/>
	</bean>
</beans>

然后新建一个类,类中main方法获取该User类,并在相应位置打断点:

public class Main {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:beans.xml");
		User user = ctx.getBean(User.class);//此处打断点
		System.out.println("user = " + user);
	}
}

之后在debug模式下运行main方法,可以看到能进入源码,并写上自己的注释,并在通过断点后打出了正确的结果,至此环境搭建完毕

报错示例与解决

程序包jdk.jfr不存在

该错误说明源码中依赖了jdk11版本的包,要么升级jdk版本,要么切换到其他分支,比如本文中的5.0.x分支

Spring-core找不到DefaultNamingPolicy类

Cannot resolve symbol ‘DefaultNamingPolicy’

这是由于gradle依赖下载缺失如下两个jar包,Spring-cglib-repackSpring-objenesis-repack

解决方案:

cmd进入Spring-core源码所在的目录,执行:gradle objenesisRepackJargradle cglibRepackJar,注意这两个命令执行结果根据网络环境不同下载时长不同,我这边刚开始执行gradle objenesisRepackJar用了很长时间最后还是失败,然后等到快夜里12点的时候,我改成先执行 gradle cglibRepackJar,再执行gradle objenesisRepackJar 十几秒就成功了。

com.gradle.build-scan相关报错

Failed to apply plugin [id ‘com.gradle.build-scan’]或者An exception occurred applying plugin request [id: ‘com.gradle.build-scan’]或者The build scan plugin is not compatible with this version of Gradle.Please see Gradle Enterprise Gradle Plugin User Manual for more information.

原因是gradle版本太高了,具体参考:gradle官方说明

Gradle Build Tool compatibility

Upgrading your Gradle version may require updating the Gradle Enterprise Gradle plugin version. The latest version of the plugin is guaranteed to be compatible with Gradle 5.0 onwards.

Gradle Build Tool versionsMinimum plugin versionMaximum plugin version
>= 6.03.03.5
5.0 - 5.6.42.0.23.5
4.1 - 4.101.81.16
4.01.7.41.16
2.0 - 3.51.01.16
< 2.0not supportednot supported
IDEA提示Kotlin: Language version 1.1 is no longer supported; please…

原因是Kotlin插件版本低,在IDEA应用市场搜索Kotlin并升级插件。

gradle Cause: zip END header not found

这个是网络不好,中断了,点击继续下载即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值