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

2024-05-13 23:58

本文主要是介绍JDK1.8及Spring5.0.x源码环境搭建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

文章目录

    • JDK1.8源码阅读环境搭建
    • SpringFramework5.0.x 源码阅读环境搭建
      • 准备工作
        • 码云账号(可选)
        • clone代码(必选)
        • 安装gradle(必选)
          • 方法一:本地安装gradle
          • 方法二:坐享其成
        • 修改下载源镜像位置
          • 修改单个项目的下载源
          • 全局设置下载源
        • 编译项目
        • 添加测试类
      • 报错示例与解决
        • 程序包jdk.jfr不存在
        • Spring-core找不到DefaultNamingPolicy类
        • com.gradle.build-scan相关报错
        • IDEA提示Kotlin: Language version 1.1 is no longer supported; please...
        • gradle Cause: zip END header not found

为何要搭建源码阅读环境呢,最开始阅读源码的环境,对于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;@Overridepublic 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

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

这篇关于JDK1.8及Spring5.0.x源码环境搭建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/987174

相关文章

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

Gradle下如何搭建SpringCloud分布式环境

《Gradle下如何搭建SpringCloud分布式环境》:本文主要介绍Gradle下如何搭建SpringCloud分布式环境问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Gradle下搭建SpringCloud分布式环境1.idea配置好gradle2.创建一个空的gr

Linux搭建单机MySQL8.0.26版本的操作方法

《Linux搭建单机MySQL8.0.26版本的操作方法》:本文主要介绍Linux搭建单机MySQL8.0.26版本的操作方法,本文通过图文并茂的形式给大家讲解的非常详细,感兴趣的朋友一起看看吧... 目录概述环境信息数据库服务安装步骤下载前置依赖服务下载方式一:进入官网下载,并上传到宿主机中,适合离线环境

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

Redis在windows环境下如何启动

《Redis在windows环境下如何启动》:本文主要介绍Redis在windows环境下如何启动的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis在Windows环境下启动1.在redis的安装目录下2.输入·redis-server.exe