1.1 在本地编译Spring Framework源码(基于当前最新版Spring Framework 6.2.0)

571 阅读4分钟

1.1.1 综述

作为Java程序员, 阅读Spring源码是进阶的必经之路, 现在的Spring采用Gradle进行构建, 速度比Maven快. 不过编译过Spring的朋友都懂, 很少有人能够一次两次就成功编译Spring. 去网上搜索各种教程, 要么版本太老不再适用, 要么就是一堆问题. 今天我将编译当前时间点最新版的Spring源码过程记录下来, 供大家参考

1.1.2 编译前准备

  • JDK: 从Spring Framework 6开始, 编译Spring最低要求JDK17+, 笔者采用的是最新的稳定版JDK21. 已经学习到Spring了, 怎么配置Java环境变量就不再多言

  • Gradle: 6.2.0版本使用的Gradle版本是8.11.1, 大佬可以动手自定义修改, 小白建议按官方的版本走. 建议先在本地解压配置好GRADLE_HOME和GRADLE_USER_HOME, 后续编译时会用到本地的Gradle, 怎么配置网上有很多文章. Gradle的下载地址services.gradle.org/distributio…, 建议大家选择gradle-8.11.1-all.zip, 如果只是选择纯二进制发布包的话, 后续在编译的过程中, 有可能还是会去下载gradle-8.11.1-src.zip的, 这个下载速度也很慢, 因此我们一步到位, 直接先下载好gradle-8.11.1-all.zip

  • IDEA: 建议使用较新的版本, 我使用的是最新的IDEA 2024.3

  • 下载Spring Framework源码, 本次使用的是6.2.0版本, 使用git clone到本地, 用IDEA打开, 目录结构如下 image-20241207213106-1dmio4l.png

1.1.3 修改配置文件

  • 修改gradle-wrapper.properties

    进入/gradle/wrapper目录, 可以找到gradle-wrapper.properties文件, 默认配置如下. 可以distributionUrl被指定了一个远程地址, 用以下载对应的Gradle版本

    由于众所周知的原因, 直接去远程下载Gradle是非常慢的, 甚至无法下载, 因此我们前面下载的Gradle就是为了在此处派上用场. 如果你看到的gradle版本不同于此, 建议以你看到的为准

    distributionBase=GRADLE_USER_HOME
    distributionPath=wrapper/dists
    distributionUrl=https://services.gradle.org/distributions/gradle-8.11.1-bin.zip
    networkTimeout=10000
    validateDistributionUrl=true
    zipStoreBase=GRADLE_USER_HOME
    zipStorePath=wrapper/dists
    

    将distributionUrl修改为如下配置, file:/// 标识指定一个本地的文件路径, 后面的路径配置为你本地下载的gradle压缩包路径

    distributionUrl=file:///C:/App/dev/gradle-version/gradle-8.11.1-all.zip
    

    总体而言配置成这样

    distributionBase=GRADLE_USER_HOME
    distributionPath=wrapper/dists
    distributionUrl=file:///C:/App/dev/gradle-version/gradle-8.11.1-all.zip
    networkTimeout=10000
    validateDistributionUrl=true
    zipStoreBase=GRADLE_USER_HOME
    zipStorePath=wrapper/dists
    
  • 修改build.gradle

    构建过程中需要下载很多依赖, 由于众所周知的原因, 很多依赖下载很慢, 因此此处换用国内的镜像, 打开根目录的build.gradle文件, 在repositories配置中添加国内的镜像, 本处使用的是阿里云的镜像

    maven { url 'https://maven.aliyun.com/repository/public' }
    

    image-20241207214124-dk6j5ml.png

  • 修改编译的JDK配置

    Spring在build时, 指定使用了BellSoft的OpenJDK, 因此在后续的编译过程中, 如果电脑上没有安装BellSoft的OpenJDK, 会自动帮你下载一个, 速度非常慢..., 因此我们最好在build之前就先更换

    1. 修改JavaConventions.java文件

      找到buildSrc/src/main/java/org/springframework/build/JavaConventions.java文件, 可以看到在这个类中声明了一个applyJavaCompileConventions​方法, 其中指定了使用BellSoft的JDK

      image-20241207214813-9724ai2.png

    2. 选择你想使用的版本

      我们可以看出JvmVendorSpec.BELLSOFT这个常量是从gradle中引入的, 查看JvmVendorSpec类的文档, 我们可以看到有如下选择

      image-20241207215014-fey63uu.png 可以看到这里定义了很多不同的JDK版本, 选择最适合你的版本即可. 笔者使用的是Oracle的OpenJDK, 因此将该处修改为ORACLE

      image-20241207215210-v075mpa.png

1.1.4 编译Spring

  1. 编译spring-oxm

    要编译spring源码, 我们首先需要编译spring-oxm模块, 进入Spring源码路径spring-framework\spring-oxm中, 打开控制台, 输入如下命令开始编译, 第一次编译会非常慢, 可能需要等待一定时间

    gradle :spring-oxm:compileTestJava
    

    等待一定时间后, 可以看到oxm模块编译成功

    image-20241207215706-8qcb5rx.png

  2. 编译spring-core

    同样, 进入spring-framework\spring-core模块中, 执行命令

    gradle :spring-core:compileTestJava
    

    可以看到编译成功

    image-20241207215859-4qyeq20.png

  1. 导入Spring项目

    点击IDEA右上角Gradle中的Sync all gradle project按钮, 导入gradle项目

    image-20241207220122-1j3w2f5.png 等待一段时间导入完成后, 显示build successful, gradle展示Spring各Moudle的列表, 至此, 编译成功

    image-20241207221530-0sjvjmk.png

1.1.5 参考资料