新版 Spring 源码构建
源码下载
这里我已经将相关的源码包上传到了 OSS 中,可以在此下载
项目 | Zip | Tar |
---|---|---|
SpringBoot |
||
Spring Framework |
||
Spring Security |
||
Spring Hateoas |
||
Spring Integration |
||
Spring Kafka |
||
Spring Ldap |
||
Spring Restdocs |
||
Spring Ws |
||
Spring Amqp |
||
Spring Batch |
||
Spring Data Cassandra |
||
Spring Data Commons |
||
Spring Data Couchbase |
||
Spring Data ElasticSearch |
||
Spring Data Gemfire |
无 |
无 |
Spring Data Geode |
||
Spring Data Jdbc |
||
Spring Data Jpa |
||
Spring Data Mongodb |
||
Spring Data Neo4j |
||
Spring Data R2dbc |
无 |
无 |
Spring Data Redis |
||
Spring Data Rest |
||
Spring Data Solr |
||
Spring Data KeyValue |
||
Spring Data Envers |
||
Spring Data Ldap |
||
Spring Retry |
https://project.jcohy.com/spring-boot-2.4.5/spring-.zip |
https://project.jcohy.com/spring-boot-2.4.5/.tar.gz |
Note
|
必须安装 JDK 环境 |
一、如何构建 SpringBoot 源码
SpringBot 在 2.2.x 版本中使用的 maven 构建工具,在 2.3.x 版本中已经替换成了 Gradle。本文使用 2.4.x 版本。关于如何使用 maven 构建。可以参考 SpringBoot 2.2.x 构建
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
-
修改内存大小
修改
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
-
添加阿里云镜像
-
修改工程下的
buildSrc
下的build.gradle
文件,找到如下代码段,添加阿里云镜像buildSrc/build.gradlerepositories { //加上阿里云镜像 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.gradlepluginManagement { 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.gradlebuildscript { 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.gradlepluginManagement { 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.javaformat
和checkstyle
插件。修改buildSrc
下的build.gradle
文件。buildSrc/build.gradleplugins { id "java-gradle-plugin" //id "io.spring.javaformat" version "${javaFormatVersion}" //id "checkstyle" }
buildSrc/build.gradledependencies { // 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.gradleplugins { 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 源码
在构建之前,您需要安装 Git 和 JDK 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) ,请点击链接下载
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
-
修改内存大小
修改
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
-
添加阿里云镜像
-
修改工程下的
buildSrc
下的build.gradle
文件,找到如下代码段,添加阿里云镜像buildSrc/build.gradlerepositories { maven { url 'https://maven.aliyun.com/repository/central' } maven { url 'https://maven.aliyun.com/repository/public' } mavenCentral() gradlePluginPortal() }
-
修改工程根目录下的
build.gradle
文件,注意,这一块需要添加buildscript
构建块(前面修改的是buildSrc
下的,注意区别),同样是加上阿里云镜像build.gradlebuildscript { 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.gradlepluginManagement { 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' } } }
-
-
其他文件修改
build.gradle
文件-
修改根目录下的
build.gradle
文件build.gradleplugins { 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' }
-