close

新版 Spring 源码构建

源码下载

这里我已经将相关的源码包上传到了 OSS 中,可以在此下载

项目 Zip Tar

SpringBoot

2.4.5

2.3.10.RELEASE

2.2.13.RELEASE

2.4.5

2.3.10.RELEASE

2.2.13.RELEASE

Spring Framework

5.3.6

5.2.14.RELEASE

5.2.12.RELEASE

5.3.6

5.2.14.RELEASE

5.2.12.RELEASE

Spring Security

5.4.6

5.3.9.RELEASE

5.2.8.RELEASE

5.4.6

5.3.9.RELEASE

5.2.8.RELEASE

Spring Hateoas

1.2.5

1.1.5.RELEASE

1.0.5.RELEASE

1.2.5

1.1.5.RELEASE

1.0.5.RELEASE

Spring Integration

5.4.6

5.3.7.RELEASE

5.2.11.RELEASE

5.4.6

5.3.7.RELEASE

5.2.11.RELEASE

Spring Kafka

2.6.7

2.5.12.RELEASE

2.3.13.RELEASE

2.6.7

2.5.12.RELEASE

2.3.13.RELEASE

Spring Ldap

2.3.3.RELEASE

2.3.3.RELEASE

Spring Restdocs

2.0.5.RELEASE

2.0.5.RELEASE

Spring Ws

3.0.10.RELEASE

3.0.10.RELEASE

Spring Amqp

2.3.6

2.2.16.RELEASE

2.2.14.RELEASE

2.3.6

2.2.16.RELEASE

2.2.14.RELEASE

Spring Batch

4.3.2

4.2.6.RELEASE

4.2.5.RELEASE

4.3.2

4.2.6.RELEASE

4.2.5.RELEASE

Spring Data Cassandra

3.1.8

3.0.9.RELEASE

2.2.12.RELEASE

3.1.8

3.0.9.RELEASE

2.2.12.RELEASE

Spring Data Commons

2.4.8

2.3.9.RELEASE

2.2.12.RELEASE

2.4.8

2.3.9.RELEASE

2.2.12.RELEASE

Spring Data Couchbase

4.1.8

4.0.9.RELEASE

3.2.12.RELEASE

4.1.8

4.0.9.RELEASE

3.2.12.RELEASE

Spring Data ElasticSearch

4.1.8

4.0.9.RELEASE

3.2.12.RELEASE

4.1.8

4.0.9.RELEASE

3.2.12.RELEASE

Spring Data Gemfire

2.3.9.RELEASE

2.2.12.RELEASE

2.3.9.RELEASE

2.2.12.RELEASE

Spring Data Geode

2.4.8

2.3.9.RELEASE

2.2.12.RELEASE

2.4.8

2.3.9.RELEASE

2.2.12.RELEASE

Spring Data Jdbc

2.1.8

2.0.9.RELEASE

1.1.12.RELEASE

2.1.8

2.0.9.RELEASE

1.1.12.RELEASE

Spring Data Jpa

2.4.8

2.3.9.RELEASE

2.2.12.RELEASE

2.4.8

2.3.9.RELEASE

2.2.12.RELEASE

Spring Data Mongodb

3.1.8

3.0.9.RELEASE

2.2.12.RELEASE

3.1.8

3.0.9.RELEASE

2.2.12.RELEASE

Spring Data Neo4j

6.0.8

5.3.9.RELEASE

5.2.12.RELEASE

6.0.8

5.3.9.RELEASE

5.2.12.RELEASE

Spring Data R2dbc

1.2.8

1.1.9.RELEASE

1.2.8

1.1.9.RELEASE

Spring Data Redis

2.4.8

2.3.9.RELEASE

2.2.12.RELEASE

2.4.8

2.3.9.RELEASE

2.2.12.RELEASE

Spring Data Rest

3.4.8

3.3.9.RELEASE

3.2.12.RELEASE

3.4.8

3.3.9.RELEASE

3.2.12.RELEASE

Spring Data Solr

4.3.8

4.2.9.RELEASE

4.1.12.RELEASE

4.3.8

4.2.9.RELEASE

4.1.12.RELEASE

Spring Data KeyValue

2.4.8

2.3.9.RELEASE

2.2.12.RELEASE

2.4.8

2.3.9.RELEASE

2.2.12.RELEASE

Spring Data Envers

2.4.8

2.3.9.RELEASE

2.2.12.RELEASE

2.4.8

2.3.9.RELEASE

2.2.12.RELEASE

Spring Data Ldap

2.4.8

2.3.9.RELEASE

2.2.12.RELEASE

2.4.8

2.3.9.RELEASE

2.2.12.RELEASE

Spring Retry

https://project.jcohy.com/spring-boot-2.4.5/spring-.zip

https://project.jcohy.com/spring-boot-2.3.10/.zip

https://project.jcohy.com/spring-boot-2.2.13/.zip

https://project.jcohy.com/spring-boot-2.4.5/.tar.gz

https://project.jcohy.com/spring-boot-2.3.10/.tar.gz

https://project.jcohy.com/spring-boot-2.2.13/.tar.gz

Note

必须安装 JDK 环境

一、如何构建 SpringBoot 源码

SpringBot 在 2.2.x 版本中使用的 maven 构建工具,在 2.3.x 版本中已经替换成了 Gradle。本文使用 2.4.x 版本。关于如何使用 maven 构建。可以参考 SpringBoot 2.2.x 构建

1、解压

我们将下载后的文件上传到服务器上,解压。我这里上传到了 /opt/springboot 目录下

tar -zxvf  spring-boot-2.4.5.tar.gz

2、修改配置

SpringBoot 是使用 Gradle 构建的,并提供了 gradle-wrapper ,这样我们就无须下载安装 Gradle 也可以进行构建。

首先我们看一下 SpringBoot 的目录结构

.
├── build.gradle
├── buildSrc
│ ├── build.gradle
│ ├── gradle.properties
│ ├── settings.gradle
│ └── src
├── ci
│ ├── config
│ ├── images
│ ├── parameters.yml
│ ├── pipeline.yml
│ ├── README.adoc
│ ├── scripts
│ └── tasks
├── CODE_OF_CONDUCT.adoc
├── CONTRIBUTING.adoc
├── eclipse
│ ├── eclipse.properties
│ └── spring-boot-project.setup
├── git
│ └── hooks
├── gradle
│ └── wrapper
├── gradle.properties
├── gradlew
├── gradlew.bat
├── idea
│ └── codeStyleConfig.xml
├── LICENSE.txt
├── README.adoc
├── settings.gradle
├── spring-boot-project
│ ├── spring-boot
│ ├── spring-boot-actuator
│ ├── spring-boot-actuator-autoconfigure
│ ├── spring-boot-autoconfigure
│ ├── spring-boot-cli
│ ├── spring-boot-dependencies
│ ├── spring-boot-devtools
│ ├── spring-boot-docs
│ ├── spring-boot-parent
│ ├── spring-boot-properties-migrator
│ ├── spring-boot-starters
│ ├── spring-boot-test
│ ├── spring-boot-test-autoconfigure
│ └── spring-boot-tools
├── spring-boot-tests
│ ├── spring-boot-deployment-tests
│ ├── spring-boot-integration-tests
│ └── spring-boot-smoke-tests
├── src
│ ├── checkstyle
│ └── nohttp
└── SUPPORT.adoc
  1. 修改内存大小

    修改 buildSrc 目录下的 gradle.properties 文件,新增如下配置:

    # 新增如下配置,解决 heap 堆内存空间不够问题
    gradlePropertiesProp=gradlePropertiesValue
    sysProp=shouldBeOverWrittenBySysProp
    systemProp.system=systemValue
    org.gradle.caching=false
    org.gradle.jvmargs=-Xms2048m -Xmx4096m
    org.gradle.parallel=true
    org.gradle.daemon=true
    org.gradle.configureondemand=true
  2. 添加阿里云镜像

    • 修改工程下的 buildSrc 下的 build.gradle 文件,找到如下代码段,添加阿里云镜像

      buildSrc/build.gradle
      repositories {
          //加上阿里云镜像
          maven { url 'https://maven.aliyun.com/repository/central' }
          maven { url 'https://maven.aliyun.com/repository/public' }
          maven { url "https://maven.aliyun.com/repository/spring" }
          mavenCentral()
          gradlePluginPortal()
          maven { url "https://repo.spring.io/release" }
      }
    • 继续修改同目录下的 settings.gradle 文件,这是全局配置文件,也要加上阿里云镜像,找到如下代码块,修改如下:

      buildSrc/settings.gradle
      pluginManagement {
         repositories {
            //加上阿里云镜像
            maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
            maven { url "https://maven.aliyun.com/repository/spring-plugin" }
            mavenCentral()
            gradlePluginPortal()
         }
         // ......
      }
    • 修改工程根目录下的 build.gradle 文件,注意,这一块需要添加 buildscript 构建块(前面修改的是 buildSrc 下的,注意区别),同样是加上阿里云镜像

      build.gradle
      buildscript {
      	repositories {
      		maven { url 'https://maven.aliyun.com/repository/central' }
      		maven { url 'https://maven.aliyun.com/repository/public' }
      		maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
      		maven { url "https://maven.aliyun.com/repository/spring-plugin" }
      	}
      }
      
      allprojects {
         group "org.springframework.boot"
      
         repositories {
      	    //阿里云镜像
      		maven { url 'https://maven.aliyun.com/repository/central' }
      		maven { url 'https://maven.aliyun.com/repository/public' }
      		mavenCentral()
      		if (!version.endsWith('RELEASE')) {
      			maven { url "https://repo.spring.io/milestone" }
      		}
      		if (version.endsWith('BUILD-SNAPSHOT')) {
      			maven { url "https://repo.spring.io/snapshot" }
      		}
         }
      }
    • 继续修改根目录下的全局配置文件 settings.gradle,同样是加上阿里云镜像

      settings.gradle
      pluginManagement {
         repositories {
      		//阿里云镜像
              maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
              maven { url "https://maven.aliyun.com/repository/spring-plugin" }
      		mavenCentral()
      		gradlePluginPortal()
      		maven {
      			url 'https://repo.spring.io/plugins-release'
      		}
      		if (version.endsWith('BUILD-SNAPSHOT')) {
      			maven { url "https://repo.spring.io/snapshot" }
      		}
         }
      }
    • 为了快速构建,我们也可以去掉相应的代码格式化和代码检测。注掉 io.spring.javaformatcheckstyle 插件。修改 buildSrc 下的 build.gradle 文件。

      buildSrc/build.gradle
      plugins {
      	id "java-gradle-plugin"
      	//id "io.spring.javaformat" version "${javaFormatVersion}"
      	//id "checkstyle"
      }
      buildSrc/build.gradle
      dependencies {
      //	checkstyle "io.spring.javaformat:spring-javaformat-checkstyle:${javaFormatVersion}"
      	implementation(platform("org.springframework:spring-framework-bom:5.3.15"))
      	implementation("com.fasterxml.jackson.core:jackson-databind:2.11.4")
      	implementation("commons-codec:commons-codec:1.13")
      	implementation("org.apache.maven:maven-embedder:3.6.2")
      	implementation("org.asciidoctor:asciidoctor-gradle-jvm:3.3.2")
      	implementation("org.gradle:test-retry-gradle-plugin:1.3.1")
      	implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.0")
      	implementation("org.jetbrains.kotlin:kotlin-compiler-embeddable:1.5.0")
      	implementation("org.springframework:spring-core")
      	implementation("org.springframework:spring-web")
      	implementation("io.spring.javaformat:spring-javaformat-gradle-plugin:${javaFormatVersion}")
      	testImplementation("org.assertj:assertj-core:3.11.1")
      	testImplementation("org.apache.logging.log4j:log4j-core:2.17.1")
      	testImplementation("org.junit.jupiter:junit-jupiter:5.6.0")
      	testRuntimeOnly("org.junit.platform:junit-platform-launcher")
      }
      
      //checkstyle {
      //	def archive = configurations.checkstyle.filter { it.name.startsWith("spring-javaformat-checkstyle")}
      //	config = resources.text.fromArchiveEntry(archive, "io/spring/javaformat/checkstyle/checkstyle.xml")
      //	toolVersion = 8.11
      //}
    • 注释掉根目录 settings.gradle 文件的 io.spring.gradle-enterprise-conventions 插件

      settings.gradle
      plugins {
      	id "com.gradle.enterprise" version "3.6.1"
      	//eid "io.spring.ge.conventions" version "0.0.7"
      }

3、源码构建

  • 构建

# 下面的命令会将执行所有测试用例,所以消耗时间比较长。
./gradlew clean build
# 如果不需要执行测试用例,可以使用以下命令
./gradlew clean build -x test
  • 构建参考文档

./gradlew asciidoctor

4、常见问题解决

4.1 无授权

Build scan background action failed.
org.gradle.process.internal.ExecException: Process 'command 'git'' finished with non-zero exit value 128
        at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:414)
        at org.gradle.process.internal.DefaultExecAction.execute(DefaultExecAction.java:38)
        at org.gradle.process.internal.DefaultExecActionFactory.exec(DefaultExecActionFactory.java:175)
        at io.spring.ge.conventions.gradle.WorkingDirectoryProcessOperations.exec(WorkingDirectoryProcessOperations.java:45)
        at io.spring.ge.conventions.gradle.ProcessOperationsProcessRunner.run(ProcessOperationsProcessRunner.java:41)
        at io.spring.ge.conventions.core.BuildScanConventions.run(BuildScanConventions.java:166)
        at io.spring.ge.conventions.core.BuildScanConventions.addGitMetadata(BuildScanConventions.java:113)
        at io.spring.ge.conventions.gradle.GradleConfigurableBuildScan.lambda$background$0(GradleConfigurableBuildScan.java:104)
        at com.gradle.enterprise.gradleplugin.internal.extension.b$3.run(SourceFile:101)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

A build scan was not published as you have not authenticated with server 'ge.spring.io'.

注释掉根目录 settings.gradle 文件的 io.spring.gradle-enterprise-conventions 插件。如下:

plugins {
	id "com.gradle.enterprise" version "3.6.1"
	//eid "io.spring.ge.conventions" version "0.0.7"
}

4.2 文件格式错误

FAILURE: Build failed with an exception.

* What went wrong:
A problem was found with the configuration of task ':spring-boot-project:spring-boot-actuator-autoconfigure:asciidoctor' (type 'AsciidoctorTask').
> Directory '/home/spring/springboot-2.4.x/spring-boot-2.4.5/spring-boot-project/spring-boot-actuator-autoconfigure/build/generated-snippets' specified for property '$4' does not exist.

二、如何构建 Spring Framework 源码

在构建之前,您需要安装 GitJDK 8 update 262 or later。 由于依赖 Java Flight Recorder (JFR) 类型,因此需要 Java 262 或更高版本。 但是请注意,Oracle JDK 不包括 JFR 类型。 因此,我们建议使用 AdoptOpenJDK 发行版或类似的发行版,其中包括 JFR 类型。 确保您的 JAVA_HOME 环境变量指向从 JDK 下载中解压的jdk1.8.0 文件夹。

这里已经下载了 OpenJDK 8 (LTS) 和 OpenJDK 11 (LTS) ,请点击链接下载

版本 Windows Linux

OpenJDK 8 (LTS)

http://software.jcohy.com/windows/OpenJDK8U-jdk_x64_windows_hotspot_8u292b10.msi

http://software.jcohy.com/linux/OpenJDK11U-jdk_x64_linux_hotspot_11.0.11_9.tar.gz

OpenJDK 11 (LTS)

http://software.jcohy.com/windows/OpenJDK11U-jdk_x64_windows_hotspot_11.0.11_9.msi

http://software.jcohy.com/linux/OpenJDK8U-jdk_x64_linux_hotspot_8u292b10.tar.gz

1、解压

我们将下载后的文件上传到服务器上,解压。我这里上传到了 /home 目录下

tar -zxvf  spring-framework-5.3.6.tar.gz

2、修改配置

Spring 是使用 Gradle 构建的,并提供了 gradle-wrapper ,这样我们就无须下载安装 Gradle 也可以进行构建。Spring 项目在构建中也使用了 Gradle。这一点需要注意。 为了加速构建,我们这里可以修改一下参数:

首先我们看一下 Spring Framework 的目录结构

.
├── build.gradle
├── buildSrc
├── ci
├── CODE_OF_CONDUCT.adoc
├── CONTRIBUTING.md
├── framework-bom
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── import-into-eclipse.md
├── import-into-idea.md
├── integration-tests
├── LICENSE.txt
├── README.md
├── SECURITY.md
├── settings.gradle
├── spring-aop
├── spring-aspects
├── spring-beans
├── spring-context
├── spring-context-indexer
├── spring-context-support
├── spring-core
├── spring-expression
├── spring-instrument
├── spring-jcl
├── spring-jdbc
├── spring-jms
├── spring-messaging
├── spring-orm
├── spring-oxm
├── spring-r2dbc
├── spring-test
├── spring-tx
├── spring-web
├── spring-webflux
├── spring-webmvc
├── spring-websocket
└── src
  1. 修改内存大小

    修改 buildSrc 目录下的 gradle.properties 文件,新增如下配置:

    # 新增如下配置,解决 heap 堆内存空间不够问题
    gradlePropertiesProp=gradlePropertiesValue
    sysProp=shouldBeOverWrittenBySysProp
    systemProp.system=systemValue
    org.gradle.caching=false
    org.gradle.jvmargs=-Xms2048m -Xmx4096m
    org.gradle.parallel=true
    org.gradle.daemon=true
    org.gradle.configureondemand=true
  2. 添加阿里云镜像

    • 修改工程下的 buildSrc 下的 build.gradle 文件,找到如下代码段,添加阿里云镜像

      buildSrc/build.gradle
      repositories {
          maven { url 'https://maven.aliyun.com/repository/central' }
          maven { url 'https://maven.aliyun.com/repository/public' }
      	mavenCentral()
      	gradlePluginPortal()
      }
    • 修改工程根目录下的 build.gradle 文件,注意,这一块需要添加 buildscript 构建块(前面修改的是 buildSrc 下的,注意区别),同样是加上阿里云镜像

      build.gradle
      buildscript {
         repositories {
            maven { url 'https://maven.aliyun.com/repository/central' }
            maven { url 'https://maven.aliyun.com/repository/public' }
            maven { url "https://repo.spring.io/plugins-release" }
         }
      }
      
      repositories {
          //阿里云镜像
          maven { url 'https://maven.aliyun.com/repository/central' }
          maven { url 'https://maven.aliyun.com/repository/public' }
          mavenCentral()
          maven { url "https://repo.spring.io/libs-spring-framework-build" }
      }
    • 继续修改根目录下的全局配置文件 settings.gradle,同样是加上阿里云镜像

      settings.gradle
      pluginManagement {
      	repositories {
      		maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
      		maven { url "https://maven.aliyun.com/repository/spring-plugin" }
      		gradlePluginPortal()
      		maven { url 'https://repo.spring.io/plugins-release' }
      	}
      }
  3. 其他文件修改 build.gradle 文件

    • 修改根目录下的 build.gradle 文件

      build.gradle
      plugins {
      	id 'io.spring.dependency-management' version '1.0.9.RELEASE' apply false
      	//id 'io.spring.ge.conventions' version '0.0.7'
      	id 'io.spring.nohttp' version '0.0.5.RELEASE'
      	id 'org.jetbrains.kotlin.jvm' version '1.3.72' apply false
      	id 'org.jetbrains.dokka' version '0.10.1' apply false
      	id 'org.asciidoctor.jvm.convert' version '2.4.0'
      	id 'org.asciidoctor.jvm.pdf' version '2.4.0'
      	id 'de.undercouch.download' version '4.1.1'
      	id "io.freefair.aspectj" version '4.1.6' apply false
      	id "com.github.ben-manes.versions" version '0.28.0'
      	id 'com.gradle.build-scan' version '3.2'
      }

3、源码构建

  • 构建

# 下面的命令会将执行所有测试用例,所以消耗时间比较长。
./gradlew clean build
# 如果不需要执行测试用例,可以使用以下命令
./gradlew clean build -x test
  • 构建参考文档

./gradlew asciidoctor
comments powered by Disqus