spring 5.3.9编译成功!
学下下spring,不看源码学的程度可能还是差点意思,而学源码,最好是吧源码下载下来自己编译,这样可以添加注释,方便自己理清思路。否则,虽然也能反编译看到源码,但是只有只读权限,没有记录的话,看起来不方便!
编译源码,搞了两天。这里主要是给自己记录下编译思路。仅供大家参考。为什么是参考呢。因为spring每个版本都不同,需要的编译环境也不同,差一点也不行!除非你对编译工具特别熟悉!
源码下载:https://github.com/spring-projects/spring-framework
这里需要上github下载,在main->branches选择想要下载的版本。如果因为网络问题打不开,可能需要FQ之类的,这里我也帮不了你!
打不开 github网站的办法:如果你可以FQ,请忽略
我这里有一个下载连接:https://codeload.github.com/spring-projects/spring-framework/zip/refs/tags/v5.3.9
如果你知道你想要下载的版本号,可以直接建立下载。我就是在这么干的,因为我家里网也不好。也就是把 v5.3.9 版本号部分 换成你想要下载的版本号,
比如下载 5.3.28 的版本 地址就是:https://codeload.github.com/spring-projects/spring-framework/zip/refs/tags/v5.3.28
当然这种根据版本号推测下载地址的办法很无奈,如果你网好,那就不用这么麻烦了。而且这种办法不保证在将来的日子里这个连接不会变,还能下载到,这里只是个下载思路的参考
有可能你连 github 网站都登录不上,我就是这样,我这里的解决方案是下载了个工具,easy-hosts-master.zip
下载地址:https://gitee.com/xiaoyutou_647/easy-hosts/repository/blazearchive/master.zip?Expires=1688045211&Signature=s522okpm09UT096VPf9Ujjiul3mZog8OilKs0cxfsnU%3D
不需要安装,在解压目录的:HostsEditor\bin\Debug 路径下有个工具 HostsEditor.exe ,这个工具会处理 C:\Windows\System32\drivers\etc 路径下的 hosts 和 hosts.bak 文件,搜索关于 github 的相关路径,
当然,如果你的 hosts 和 hosts.bak 有权限问题的话,还要解决下权限问题,不然 HostsEditor.exe 也无法写入内容
解决办法就是本分下这两个文件,用 记事本打开文件,另存为 选在 保存类型选 所有文件(*) ,覆盖原来的文件,在用 HostsEditor.exe 处理一下,会发现hosts 和 hosts.bak 里的内容多了好多
修改hosts 和 hosts.bak 文件只能让打开 github网站更方便些,不能解决下载源码问题,但是看看文档之类的还行
gradle下载:https://services.gradle.org/distributions/
这个地址,感觉版本不全,如果找不到对应的版本,我这里也提供下下载地址 :https://downloads.gradle.org/distributions/gradle-6.8.3-bin.zip
然后你自己去修改你想要下载的 gradle-x.x.x-bin.zip 的版本号部分吧。
下载后直接解压就行
配置环境变量:gradle-repository自己建立的gradle仓库,类似maven
GRADLE_HOME = D:\Program Files (x86)\gradle-6.8.3
GRADLE_USER_HOME = D:\Program Files (x86)\gradle-repository
dos下查看配置生效:>gradle -v
重点:
spring-framework 的运行需要的jdk版本要求很宽泛,以下是搜的,我的误区就是以为 jdk版本只要在这个区间范文内,就可以编译,结果幼稚了!
Spring Framework版本 | JDK版本 |
---|---|
6.0.x | JDK 17-21 |
5.3.x | JDK 8-19 |
5.2.x | JDK 8-15 |
5.1.x | JDK 8-12 |
5.0.x | JDK 8-10 |
4.3.x | JDK 6-8 |
我想编译5.3.9的spring版本,用的 jdk17 应该没问题吧,结果报错如下
Unsupported Java. Your build is currently configured to use Java 17.0.3 and Gradle 6.8.3. Possible solution: - Use Java 15 as Gradle JVM: Open Gradle settings - Upgrade Gradle wrapper to 7.2 version and re-import the project
Gradle 6.8.3要用jdk15, 现在是jdk17,提示让把gradle升级到7.2版本,能升吗,不能,因为spring,指定了Gradle 的编译版本,如下:
spring-framework 源码目录的 spring-framework-5.3.9\gradle\wrapper 下的 gradle-wrapper.properties 里配置了编译此版本的spring需要用到的 gradle 版本
它的原始配置 distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip 是这样,需要编译的时候下载 gradle.我们提前下载好了 gradle
就需要改成 distributionUrl=file:///g:/tool/gradle-6.8.3-bin.zip 注意这里是下载的gradle-6.8.3-bin.zip所在位置,不是你解压的路径
那么现在看来,只要吧jdk 降为jdk15应该就都满足了!我觉得是,但是我没那么做,我本地的jdk已经有 jdk1.8 jdk11 jdk17 三个版本了
于是我直接吧gradle所用的jdk版本指定为jdk11了,报错解决;一下我会贴上我的配置截图,仅供参考
1.修改spring-framework-5.3.9\gradle 下的 docs.gradle 注释掉了 dokka 方法 、asciidoctor 方法 并修改 task schemaZip
task schemaZip修改部分
META-INF/spring.schemas 改为:META-INF\\spring.schemas
it.path.endsWith(schemas.get(key)) 改为:it.path.endsWith(schemas.get(key).replaceAll('\\/','\\\\'))
注意不同的版本,这三处方法,可能不同甚至没有,修改不修改的作用未知,并未做验证,仅供参考
2.build.gradle 添加下载镜像
maven { url "https://maven.aliyun.com/repository/central" }//阿里云 国内镜像
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/'} //阿里云 国内镜像
maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}//阿里云 国内镜像
3.settings.gradle 添加下载镜像:
maven { url "https://maven.aliyun.com/repository/spring-plugin" }//添加镜像
4.修改默认gradle为本地gradle
5.项目编码修改
6项目配置jdk17
7指定gradle所用jdk版本,统一用jdk17会如上报错
8 项目导入成功后,先编译oxm 模块 和core模块,这个在文件中已经说明
9.最后整体编译
10.gradle为啥非要用jdk15,我指定了jdk11 也能通过的一些蛛丝马迹
总结:如果想统一jdk,我这个spring5.3.9的版本应该用jdk15看来最合适。大家可以试一下。这篇文章只是记录下解决问题的思路,希望大家少走弯路。
最后再提一下,此文章编译通过的版本是 springFramwork5.3.9版本,笔者用的jdk17 + gradle-6.8.3(依赖jdk11) ,但最稳妥应该统一用jdk15才合适
若是其他的spring版本,可能还会有些不同,此处仅提供一下编译思路上的参考,若有什么不周到的地方,请大家留言指教。
新建个测试模块
新建-新模块-构建系统选gradle,添加依赖 添加依赖后刷新一下 gradle 和 maven 类似
代码:
@Configuration @ComponentScan("com.cyf.test") public class MyConfig { } @Service public class UserService { } public class TestApplication { public static void main(String[] args) { AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MyConfig.class); UserService bean = annotationConfigApplicationContext.getBean(UserService.class); System.out.println(bean); } }
断点调试,添加源码注释的目标至此达成
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?