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

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

Centos7安装JDK1.8保姆版

工欲善其事,必先利其器。这句话同样适用于学习Java编程。在开始Java的学习旅程之前,我们必须首先配置好适合的开发环境。 通过事先准备好这些工具和配置,我们可以避免在学习过程中遇到因环境问题导致的代码异常或错误。一个稳定、高效的开发环境能够让我们更加专注于代码的学习和编写,提升学习效率,减少不必要的困扰和挫折感。因此,在学习Java之初,投入一些时间和精力来配置好开发环境是非常值得的。这将为我

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

安装nodejs环境

本文介绍了如何通过nvm(NodeVersionManager)安装和管理Node.js及npm的不同版本,包括下载安装脚本、检查版本并安装特定版本的方法。 1、安装nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash 2、查看nvm版本 nvm --version 3、安装

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

高并发环境中保持幂等性

在高并发环境中保持幂等性是一项重要的挑战。幂等性指的是无论操作执行多少次,其效果都是相同的。确保操作的幂等性可以避免重复执行带来的副作用。以下是一些保持幂等性的常用方法: 唯一标识符: 请求唯一标识:在每次请求中引入唯一标识符(如 UUID 或者生成的唯一 ID),在处理请求时,系统可以检查这个标识符是否已经处理过,如果是,则忽略重复请求。幂等键(Idempotency Key):客户端在每次

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、