源码地址:spring-framework-v5.2.22.RELEASE
官方文档:spring-framework-5.2.22.RELEASE-reference

为啥要编译源码?

  1. 用了这么多年的 Spring,没编译过源码怎么行!
  2. 可以在源码加上自己的注释,阅读源码的一种方式;
  3. 锻炼调试代码的能力,应为很多时候 debug 看代码更快;
  4. 学习里面的设计模式,设计原则;
  5. 面试 (▼へ▼メ);

前提准备:

接下来详细说明步骤:
解压后源码文件,先关注两个md 文件:README.md,import-into-idea.md ,
这两个文件说明了如何编译原码及导入开发工具中;

修改原码中的 gradle 配置文件

settings.gradle
settings.gradle 替换为阿里的镜像源;

  1. pluginManagement {
  2. repositories {
  3. gradlePluginPortal()
  4. // maven { url 'https://repo.spring.io/plugins-release' }
  5. maven { url "https://maven.aliyun.com/repository/public" }
  6. }
  7. }

gradle.properties
增加下面的三项;

  1. version=5.2.22.RELEASE
  2. org.gradle.jvmargs=-Xmx1536M
  3. org.gradle.caching=true
  4. org.gradle.parallel=true
  5. ## 启用新的孵化模式
  6. org.gradle.configureondemand=true
  7. ## 开启守护进程 通过开启守护进程,下一次构建的时候,将会连接这个守护进程进行构建,
  8. ## 而不是重新fork一个gradle构建进程
  9. org.gradle.daemon=true
  10. ## 这个配置是指定我们的jdk目录
  11. org.gradle.java.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home

Mac 下查看 jdk 目录的命令:/usr/libexec/java_home -V
build.gradle
同样是添加阿里的镜像源;

  1. repositories {
  2. mavenCentral()
  3. // maven { url "https://repo.spring.io/libs-spring-framework-build" }
  4. maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
  5. maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
  6. }

预编译spring-oxm、spring-core

这两个模块在导入开发工具前,需要先编译下,命令如下所示:
./gradlew :spring-oxm:compileTestJava

  1. spring-framework-5.2.22.RELEASE ./gradlew :spring-oxm:compileTestJava
  2. fatal: 不是 git 仓库(或者任何父目录):.git
  3. > Task :spring-oxm:genJaxb
  4. [ant:javac] : warning: 'includeantruntime' was not set
  5. , defaulting to build.sysclasspath=last;
  6. set to false for repeatable builds
  7. BUILD SUCCESSFUL in 2m 46s

./gradlew :spring-core:compileTestJava

  1. spring-framework-5.2.22.RELEASE ./gradlew :spring-core:compileTestJava
  2. fatal: 不是 git 仓库(或者任何父目录):.git
  3. BUILD SUCCESSFUL in 12s
  4. 17 actionable tasks: 2 executed, 15 up-to-date

出现两个 success 即表示成功。
如果你的代码不是 git 拉取的话,会有个 git 相关的报错不影响使用,见《一些报错》中的说明。

导入 IDEA

File —>New —>Project from Existing Sources,构建工具选择 gradle ,选择我们预编译好的源码;
它会进行一些列的配置,这个时候我们可以修改下 IDEA 的 gradle 配置;
配置 gradle user home,及下面的 Gradle projects 相关,见下图所示:
27150334-spring.webp

配置完毕出现 success 后,点击右侧 gradle 侧边栏上的刷新按钮,重载下所有项目等到 success ;

测试项目

  1. 新建一个子模块 spring-lich-test;
  2. build.gradle,依赖下spring-context 测试即可; ```properties dependencies { compile(project(“:spring-context”)) testImplementation ‘org.junit.jupiter:junit-jupiter-api:5.8.1’ testRuntimeOnly ‘org.junit.jupiter:junit-jupiter-engine:5.8.1’ }

完整如下:

plugins { id ‘java’ }

group ‘org.springframework’ version ‘5.2.22.RELEASE’

repositories { mavenCentral() }

dependencies { compile(project(“:spring-context”)) testImplementation ‘org.junit.jupiter:junit-jupiter-api:5.8.1’ testRuntimeOnly ‘org.junit.jupiter:junit-jupiter-engine:5.8.1’ }

test { useJUnitPlatform() }

  1. 增加测试接口等测试代码:
  2. ```java
  3. package cn.lichenghao.service;
  4. import org.springframework.stereotype.Component;
  5. /**
  6. * 测试接口
  7. *
  8. * @author chenghao.li
  9. */
  10. @Component
  11. public class HelloService {
  12. public void say() {
  13. System.out.println("hello world");
  14. }
  15. }

测试,Hello World~

  1. package cn.lichenghao.service;
  2. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  3. /**
  4. * 测试 Hello World
  5. *
  6. * @author chenghao.li
  7. */
  8. public class App {
  9. public static void main(String[] args) {
  10. AnnotationConfigApplicationContext context
  11. = new AnnotationConfigApplicationContext("cn.lichenghao.service");
  12. HelloService helloService = context.getBean(HelloService.class);
  13. helloService.say();
  14. }
  15. }

正常的话会打印如下:

  1. 15:14:55: Executing ':spring-lich-test:App.main()'...
  2. > Task :buildSrc:compileJava UP-TO-DATE
  3. > Task :buildSrc:compileGroovy NO-SOURCE
  4. > Task :buildSrc:pluginDescriptors UP-TO-DATE
  5. > Task :buildSrc:processResources UP-TO-DATE
  6. > Task :buildSrc:classes UP-TO-DATE
  7. > Task :buildSrc:jar UP-TO-DATE
  8. > Task :buildSrc:assemble UP-TO-DATE
  9. > Task :buildSrc:pluginUnderTestMetadata UP-TO-DATE
  10. > Task :buildSrc:compileTestJava NO-SOURCE
  11. > Task :buildSrc:compileTestGroovy NO-SOURCE
  12. > Task :buildSrc:processTestResources NO-SOURCE
  13. > Task :buildSrc:testClasses UP-TO-DATE
  14. > Task :buildSrc:test NO-SOURCE
  15. > Task :buildSrc:validateTaskProperties UP-TO-DATE
  16. > Task :buildSrc:check UP-TO-DATE
  17. > Task :buildSrc:build UP-TO-DATE
  18. Configuration on demand is an incubating feature.
  19. fatal: 不是 git 仓库(或者任何父目录):.git
  20. > Task :spring-lich-test:processResources NO-SOURCE
  21. > Task :spring-expression:processResources UP-TO-DATE
  22. > Task :spring-core:cglibRepackJar UP-TO-DATE
  23. > Task :spring-aop:processResources UP-TO-DATE
  24. > Task :spring-beans:processResources UP-TO-DATE
  25. > Task :spring-core:objenesisRepackJar UP-TO-DATE
  26. > Task :spring-context:processResources UP-TO-DATE
  27. > Task :spring-core:processResources UP-TO-DATE
  28. > Task :spring-instrument:compileJava UP-TO-DATE
  29. > Task :spring-instrument:processResources NO-SOURCE
  30. > Task :spring-instrument:classes UP-TO-DATE
  31. > Task :spring-instrument:jar UP-TO-DATE
  32. > Task :kotlin-coroutines:compileKotlin UP-TO-DATE
  33. > Task :kotlin-coroutines:compileJava NO-SOURCE
  34. > Task :kotlin-coroutines:processResources NO-SOURCE
  35. > Task :kotlin-coroutines:classes UP-TO-DATE
  36. > Task :kotlin-coroutines:inspectClassesForKotlinIC UP-TO-DATE
  37. > Task :kotlin-coroutines:jar UP-TO-DATE
  38. > Task :spring-jcl:compileJava UP-TO-DATE
  39. > Task :spring-jcl:processResources UP-TO-DATE
  40. > Task :spring-jcl:classes UP-TO-DATE
  41. > Task :spring-jcl:jar UP-TO-DATE
  42. > Task :spring-core:compileKotlin UP-TO-DATE
  43. > Task :spring-core:compileJava UP-TO-DATE
  44. > Task :spring-core:classes UP-TO-DATE
  45. > Task :spring-core:inspectClassesForKotlinIC UP-TO-DATE
  46. > Task :spring-core:jar UP-TO-DATE
  47. > Task :spring-expression:compileKotlin UP-TO-DATE
  48. > Task :spring-expression:compileJava UP-TO-DATE
  49. > Task :spring-expression:classes UP-TO-DATE
  50. > Task :spring-expression:inspectClassesForKotlinIC UP-TO-DATE
  51. > Task :spring-expression:jar UP-TO-DATE
  52. > Task :spring-beans:compileGroovy UP-TO-DATE
  53. > Task :spring-beans:compileKotlin UP-TO-DATE
  54. > Task :spring-beans:compileJava NO-SOURCE
  55. > Task :spring-beans:classes UP-TO-DATE
  56. > Task :spring-beans:inspectClassesForKotlinIC UP-TO-DATE
  57. > Task :spring-beans:jar UP-TO-DATE
  58. > Task :spring-aop:compileJava UP-TO-DATE
  59. > Task :spring-aop:classes UP-TO-DATE
  60. > Task :spring-aop:jar UP-TO-DATE
  61. > Task :spring-context:compileKotlin UP-TO-DATE
  62. > Task :spring-context:compileJava UP-TO-DATE
  63. > Task :spring-context:compileGroovy NO-SOURCE
  64. > Task :spring-context:classes UP-TO-DATE
  65. > Task :spring-context:inspectClassesForKotlinIC UP-TO-DATE
  66. > Task :spring-context:jar UP-TO-DATE
  67. > Task :spring-lich-test:compileJava UP-TO-DATE
  68. > Task :spring-lich-test:classes UP-TO-DATE
  69. > Task :spring-lich-test:App.main()
  70. hello world
  71. BUILD SUCCESSFUL in 3s
  72. 35 actionable tasks: 1 executed, 34 up-to-date

一些报错

  1. 如果不是 git 拉取的项目,那么会有如下的报错:

    1. Build scan background action failed.
    2. org.gradle.process.internal.ExecException:
    3. Process 'command 'git'' finished with non-zero exit value 128

    不影响使用,如果你有强迫症的话,可以用 git 拉取项目;或者你可以 git 建一个空的项目然后把下载的原码放进去也行;

  2. com.ibm.websphere:uow:6.0.2.17. ```properties :spring-tx:test: Could not find com.ibm.websphere:uow:6.0.2.17. Required by: project :spring-tx

Possible solution:

  • Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html
    1. Build.gradle 增加<br />[https://maven.aliyun.com/repository/spring](https://maven.aliyun.com/repository/spring)
    2. ```properties
    3. repositories {
    4. mavenCentral()
    5. // maven { url "https://repo.spring.io/libs-spring-framework-build" }
    6. maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
    7. maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
    8. maven { url "https://maven.aliyun.com/repository/spring" }
    9. }