- 我编译的版本信息:
- spring 5.3.x
- gradle:7.5.1
- jdk:17
- idea:2021.2.2
- 通过git或者下载zip包,将spring的源码下载过来(嫌弃gitHub太慢的话,可以在码云上下载,有镜像仓库)。github.com/spring-proj…
- 代码下载完成后,优先看一下人家官网上编译源码的教程。尤其看下JDK的版本要求:
一定要注意版本,要不然,各种错误。有的度娘还能搜出来,有的要哭。
虽然官网说1.8可以,但是实际操作下来,还是用了17版本的JDK,不然会报找不到类,因为有的包要JDK9以后才有。
- spring编译工具使用gradle的,接着安装gradle。这个版本也要注意,我个人是看源码gradle\wrapper目录下gradle-wrapper.properties文件中的distributionUrl值,是啥版本,我就安装啥版本(官网:gradle.org/)。
安装方法和maven简直一样,下载对应版本,解压到一个目录,然后配置环境变量。需要配置以下几个环境变量:
- GRADLE_HOME(配gradle的目录)
- 在path上添加:%GRADLE_HOME%\bin
- GRADLE_USER_HOME(下载依赖包的保存路径,查了资料说这个路劲是gradle缓存东西用的)
安装完成后,打开cmd,执行一下 gradle -v 检查是否安装成功。
安装成功后,在gradle的安装目录下,进入init.d文件夹,创建一个init.gradle文件,内容如下:
allprojects {
repositories {
maven { url 'file:///C:/Users/User/.m2/repository'} // 会优先从指定目录查询依赖
maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" } // 设置阿里镜像地址
mavenCentral()
}
}
- 打开spring源码根目录下的build.gradle文件,添加阿里的maven镜像地址:
maven{ url 'https://maven.aliyun.com/nexus/content/groups/public'}
maven{ url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
再打开根目录下的settings.gradle文件,添加阿里的maven镜像地址:
maven{ url 'https://maven.aliyun.com/nexus/content/groups/public'}
maven{ url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
maven { url 'https://maven.aliyun.com/repository/public' } //阿里云
maven { url 'https://maven.aliyun.com/repository/central' } //阿里云
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } //插件
再打开源码gradle/wrapper目录下的gradle-wrapper.properties文件,将distributionUrl换成本地的,这个就是之前下载的gradle安装包,注意指向的是.zip文件。
注意文件路径上不要有空格之类的,要不然会报错。
别问为什么设置这么多镜像,一切都是为了加快依赖的下载速度~~~
- 以上步骤都完成后,就可以编译了。我看网上,大家都是在源码的根目录,打开cmd,然后使用gradlew build来编译的。但是试了很多遍,jar老是下载不过来(网络不好之类的,一次又要好长时间,要崩溃),报错。然后就索性直接导到idea中,编译了几次,终于编译success了。
- 编译过程中报的错误:
- jdk版本不对:刚开始用的最新的spring版本,jdk用的1.8导致报错。针对较新版本的spring源码,要用JDK17或者21
C:\Users\User\IdeaProjects\spring-framework\buildSrc\src\main\java\org\springframework\build\KotlinConventions.java:44: 错误: 找不到符号
freeCompilerArgs.addAll(List.of("-Xsuppress-version-warnings", "-Xjsr305=strict", "-opt-in=kotlin.RequiresOptIn"));
^
符号: 方法 of(java.lang.String,java.lang.String,java.lang.String)
位置: 接口 java.util.List
- idea控制台错误乱码
打开idea的 Help 》》》 Edit Customer VM Options 添加 -Dfile.encoding=UTF-8
spring源码根目录下gradle.properties 文件 添加 org.gradle.jvmargs=-Dfile.encoding=UTF-8
- 源码编译过程中报如下错误
Process 'command 'git'' finished with non-zero exit value 128
百度了很久,后面看到有人说,是因为功能不是git项目报错,只要重新用git初始化一下工程,再commit一下,就好了。试了一下,凑效了
git init
git add .
git commit "spring source test"
- 报Kotlin: warnings found and -Weeror specified
因为缺少cglib、objenesis包,解决步骤如下:双击加载cglibRepackJar和objenesisRepackJar
看着好像很简单,中间尝试了两三天~~~
参考文章:zhuanlan.zhihu.com/p/380397684… zhuanlan.zhihu.com/p/571290482