步骤
下载对应工具
1.下载gradle,使用下载好的gradle进行编译,不需要太新,但是版本一定要匹配(好像没碰到版本冲突问题,注意一下就得了)。
gradle网址:https://services.gradle.org/distributions/
下载好后记得配置环境变量
方式一:
1.新增环境变量GRADLE_HOME->文件安装目录
2.配置Path新增%GRADLE_HOME%bin
即可
方式二:
直接在path新增下载好的gradle的bin目录
即可。
环境变量截图
通过gradle -v
命令测试环境变量是否配置好
2.IDEA安装kotlin,只需要在setting->plugins
搜索这个插件下载安装在重启IDEA即可。
3.下载Spring源码
下载地址: https://github.com/spring-projects/spring-framework/tree/5.0.x
编译部分
1.进入到下载好的源码目录,通过命令行cmd去执行gradlew.bat命令
。我试了直接点gradlew.bat命令,但是最后编译完成就消失了,也不知道结果是成功还是失败。
这里碰到了编译失败的问题,后面统一说明BUG问题。
执行完后会提示BUILD SUCCESSFUL
,即表示成功。
补充说明
这里补充一下,下载好的Spring源码中有import-into-idea.md
这个文件,里面有一些说明。
译文(推荐用有道翻译):
总结就是:
1.先编译那两个基底包
2.aspects可能会有错,可以在build.gradle文件
说将其排除掉
3.有一些测试的问题需要调整参数
4.必须通过命令来测试某个模块
在执行完gradle.bat
命令后,我就直接做了1和4
。直到可以跑通源码也没做2和3
。所以在过程中可能出现比较多的问题吧。
结果图:
2.导入IDEA
这个就直接导入即可,然后他就会自动下载。
我找网上的资料,都是说导入的时候让你对gradle项目进行一些设置。但是不管我用什么方式导入
,都没有设置的选项。
所以我在把项目导入IDEA后先手动停止他下载依赖,我进行了一些配置在重新刷新。
修改配置图:
重新下载依赖:
这里需要一定的时间,所以耐心等待。建议在网络较好的环境下进行,避免不必要的问题(超时等等)
最后下载成功:
测试
1.在Spring-context
模块中,通过自己的方式创建上下文,我使用的是注解。
2.编写一个实体类和启动程序,启动程序中创建Spring容器并获取对应实体bean对象。
补充说明
可以通过写注释,打断点的方式看是否跳到对应的代码行
。
需要注意,修改完注释后需要重新编译(执行右边gradle下的build中的jar命令),这样才能保证修改的注释生效。(因为编译后的是class字节码文件,我们在后面也是引入是字节码文件,在java代码编写完后重新打包编译生成字节码后,新的注释才能生效)
其他工程引入自己编译的源码
编译自己的Spring源码肯定是想要在自己的Demo工程中去进行引入测试,看看其执行流程或者是代码如何编写的。
但是直接从maven下载的都是read-only
的,不能在上面写一些自己理解的注释,所以才导入了自己编译的Spring源码。
导入过程:
进入项目环境
选择library:
先引入运行的字节码文件:
然后引入source资源目录:
最后,我移除了maven下载的官方包
最终结果:
其他涉及到的模块也类似这样处理。
补充问题
这里需要说明一下,对于引入字节码和source我是这样理解的。
引入class字节码
只是告诉JVM运行的时候字节码文件在哪,在运行的时候你只需要加载我对应目录的字节码文件去运行就可以了。
而进入source资源
只是为了我们点进源码中,能看到源码,并在源码上添加属于自己的注释。
所以,当我们修改源码注释的时候,需要重新编译打包成字节码文件,新的字节码文件就会替换掉旧的。JVM在执行加载的时候才能显出我们新修改过后的源代码。
这样就避免了修改了注释,重新DEBUG的时候直接跳过断点的问题。
碰到的问题
最主要的问题是gradle编译
和使用IDEA引入下载依赖
这里我两者都会出Build Fail
。
报的错就是Could not resolv xxx.jar
,Could not get https://abc.123xyz.com/xxx.jar
大概就是一些无法下载编译包的问题。这里也找了很长时间,确实是一个大坑。
这块的话我主要是添加仓库来源来解决他:
增加了google()
和jcenter()
。还有一些例如hibernate-validator
下载不下来,我直接去maven仓库找到其下载路径,单独引入进来。
引入到仓库后,在dependencies
块中也要新增complie xxxx
标识,具体从maven仓库中赋值。
强烈建议:在使用命令行编译的时候就修改build.gradle中的仓库镜像,这样能大大加快速度并且减少不必要的报错
maven仓库地址:https://mvnrepository.com/
镜像URL:
repositories {
maven { url "https://mvnrepository.com/artifact/org.javamoney/moneta" }
jcenter()
//google()
maven { url "https://mvnrepository.com/artifact/org.hibernate/hibernate-validator" }
maven { url "https://maven.aliyun.com/repository/spring-plugin" }
maven { url "https://repo.spring.io/plugins-release" }
}
其他的问题:
其他的问题我是没碰到,但是其他小伙伴好像出现了版本不匹配,编译出错的情况。
这一块的话,好像是不能太高的版本,也不能太低,包括JVM,Gradle,Kotlin
这里我Kotlin没有修改过,JDK是1.8的环境,Gradle是4.3.1,编译的Spring是5.0.2 RELEASE。
但是,最终在运行的时候报了一个错。
是某一个类实现的接口的方法不全,我通过alt+enter
直接将其完成了一个空实现,最后程序能正常跑通。
关于这一块,以后在碰到的时候在进行处理,毕竟走了一下简单的时序流程,发现没有什么太大的问题。主要功能好像也没受到影响,所以就不在细去解决这个空方法的问题,毕竟源码这个东西也不是说一天两天就搞得明白的,况且也不需要对源码的每一行都进行理解。
小结
这块我自己是一波三折,找了很多文章和解决办法终于是把他解决了。
最主要的是一定要在网络条件较好的情况下进行
,我自己是出现了几次time out的情况,浪费了一些时间。
在编译的过程中,耐心等待即可,因为涉及到的依赖包实在是太多了。
最重要的是解决办法的思路,也不能一股脑的就复制粘贴到百度,提炼一下关键点。
我在处理下载依赖下不下来的时候,我也是后面才慢慢想到是仓库源的问题,然后又牵扯到maven仓库。
毕竟之前一直都是用maven,想到maven可以直接把东西下好放到对应的本地仓库地址中去,然后IDEA在下载的时候会先检查本地,这时我通过手动已经下载并复制进去了,那么IDEA就检查到了。
类比到Gradle,找到仓库下载源,添加到repositories
中去,果然就download下来了。
过程中也参考了一些伙伴的文章,提供了不少的思路:
https://blog.csdn.net/qq_35576976/article/details/105616432?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control
https://blog.csdn.net/m0_37615458/article/details/103804927
https://blog.csdn.net/weixin_43286186/article/details/96479324