spring-framework源码编译

253 阅读3分钟
  1. 我编译的版本信息:
  • spring 5.3.x
  • gradle:7.5.1
  • jdk:17
  • idea:2021.2.2
  1. 通过git或者下载zip包,将spring的源码下载过来(嫌弃gitHub太慢的话,可以在码云上下载,有镜像仓库)。github.com/spring-proj…
  2. 代码下载完成后,优先看一下人家官网上编译源码的教程。尤其看下JDK的版本要求:

image.png 一定要注意版本,要不然,各种错误。有的度娘还能搜出来,有的要哭。 虽然官网说1.8可以,但是实际操作下来,还是用了17版本的JDK,不然会报找不到类,因为有的包要JDK9以后才有。

  1. spring编译工具使用gradle的,接着安装gradle。这个版本也要注意,我个人是看源码gradle\wrapper目录下gradle-wrapper.properties文件中的distributionUrl值,是啥版本,我就安装啥版本(官网:gradle.org/)。

image.png 安装方法和maven简直一样,下载对应版本,解压到一个目录,然后配置环境变量。需要配置以下几个环境变量:

  • GRADLE_HOME(配gradle的目录)
  • 在path上添加:%GRADLE_HOME%\bin
  • GRADLE_USER_HOME(下载依赖包的保存路径,查了资料说这个路劲是gradle缓存东西用的)
    安装完成后,打开cmd,执行一下 gradle -v 检查是否安装成功。

image.png 安装成功后,在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()
    }
}
  1. 打开spring源码根目录下的build.gradle文件,添加阿里的maven镜像地址:

image.png

maven{ url 'https://maven.aliyun.com/nexus/content/groups/public'}
maven{ url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}

再打开根目录下的settings.gradle文件,添加阿里的maven镜像地址:

image.png

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文件。

image.png 注意文件路径上不要有空格之类的,要不然会报错。
别问为什么设置这么多镜像,一切都是为了加快依赖的下载速度~~~

  1. 以上步骤都完成后,就可以编译了。我看网上,大家都是在源码的根目录,打开cmd,然后使用gradlew build来编译的。但是试了很多遍,jar老是下载不过来(网络不好之类的,一次又要好长时间,要崩溃),报错。然后就索性直接导到idea中,编译了几次,终于编译success了。

1696760870836_43C5DE34-5C19-4f87-968A-B874032AB11B.png

  1. 编译过程中报的错误:
  • 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

image.png

看着好像很简单,中间尝试了两三天~~~

参考文章:zhuanlan.zhihu.com/p/380397684… zhuanlan.zhihu.com/p/571290482