01
下载Spring源码
进入 Spring 官网进行下载
我这里选择的是 5.1.x 版本的 Spring,然后点击 Clone or download,如果会 Git 可以使用 Git 命令的方式,不会的话选择下载 ZIP 压缩包,下载好之后需要解压。
解压好之后,我们为 Spring 添加阿里云镜像。在编译过程中,Spring会去自动下载一些依赖的包,默认使用的是官方的镜像,下载比较慢,所以我们提前添加好国内镜像,将下面这行代码粘贴到 build.gradle 文件中的 repositories 节点下即可。
//添加阿里云镜像maven { url "http://maven.aliyun.com/nexus/content/groups/public" }
02
前期运行环境与工具准备
JDK 版本:1.8.0_162 (版本1.8就行,我的是1.8最新版,高于1.8的没试过)。
JDK 下载地址:
https://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-zhs.html
我们这里使用 Gradle 搭建,所以还需要配置 Gradle 环境。
注意:这里会有一个问题,就是如果我们创建的项目和 Gradle 版本冲突了怎么办,也就是说 Spring 需要的版本和我们下载的版本不一致时怎么办?
解决:分两种情况,一种是系统没有 Gradle 环境,另一种是系统有 Gradle 环境。
第一种:我们先不配置 Gradle,进入本地 Spring 目录,在当前目录打开 cmd,输入命令:
gradlew :spring-oxm:compileTestJava
出现 BUILD SUCCESS 字样时说明构建成功,如下图所示
在 Spring-frameword-5.1x/.gradle 目录中可以看到 4.10.3,那么下载 4.10.3 版本即可。
第二种:如果系统本身就有 Gradle 那么直接进行第三模块,导入 IDEA。在 IDEA 中编译 compileTestJava 即可,在 .gradle 目录中可以看到相应的 Gradle 版本。但是需要重新下载 Gradle 版本,重新进行配置。
Gradle 配置教程:
https://www.cnblogs.com/linkstar/p/7899191.html
为了编译过程更快,我们为安装好的 Gradle 配置国内镜像。
进入 Gradle 安装目录,在 init.d 目录下新建一个 init.gradle 文件,并添加以下内容:
allprojects{ repositories { def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/' all { ArtifactRepository repo -> def url = repo.url.toString() if ((repo instanceof MavenArtifactRepository) && (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com'))) { project.logger.lifecycle 'Repository ${repo.url} replaced by $REPOSITORY_URL .' remove repo } } maven { url REPOSITORY_URL } }}
03
导入IDEA
点击 File->New->Project form Existing Sources... 打开项目。
选择刚刚解压的 Spring 项目工程。
选择 Gradle。
选择自己配置的 Gradle 环境。
调整内存:
-XX:MaxPermSize=2048m -Xmx2048m -XX:MaxHeapSize=2048m
因为我是第二次配置 Gradle,所以我的重新创建 Spring 环境,没有这一步,如果有的话按照下面配置即可。
点击 Finish。
注意:在点击 finish 前,最好是能够开启 VPN,构建过程会要下载大量的依赖包跟插件,所以很慢,就算已经配置了阿里云镜像以及 Gradle,也会很慢,也可能是我网络的原因,说不清。
下载过程:
项目导入到 IDEA 成功,如下图所示:
04
开始编译
修改 docs.gradle 文件:
注释掉 dokka 和 asciidoctor 两个配置项:
因为在构建过程中执行这两个任务时会导致构建失败,这两个任务主要是用来生成文档使用,对主流程并没有任何影响,可以直接忽略,当然如果大家本地没有这个问题,也可以不注释。
替换 docs.gradle 文件中的 task schemaZip 代码:
在 Gradle 的构建脚本,只针对 Linux 系统做了适配,需要把 task schemaZip 替换成下面代码,因为原有代码的路径符号" / "是针对 Linux 的, Windows 使用会有问题,在 Windows 环境需要替换成" \\ ",否则会出现异常。
//这部分被替换了,所以需要被替换掉//task schemaZip(type: Zip) {// group = "Distribution"// baseName = "spring-framework"// classifier = "schema"// description = "Builds -${classifier} archive containing all " +// "XSDs for deployment at https://springframework.org/schema."// duplicatesStrategy 'exclude'// moduleProjects.each { subproject ->// def Properties schemas = new Properties();//// subproject.sourceSets.main.resources.find {// (it.path.endsWith("META-INF/spring.schemas") || it.path.endsWith("META-INF\\spring.schemas"))// }?.withInputStream { schemas.load(it) }//// for (def key : schemas.keySet()) {// def shortName = key.replaceAll(/http.*schema.(.*).spring-.*/, '$1')// assert shortName != key// File xsdFile = subproject.sourceSets.main.resources.find {// (it.path.endsWith(schemas.get(key)) || it.path.endsWith(schemas.get(key).replaceAll('\\/','\\\\')))// }// assert xsdFile != null// into (shortName) {// from xsdFile.path// }// }// }//} //替换成如下代码即可task schemaZip(type: Zip) { group = "Distribution" baseName = "spring-framework" classifier = "schema" description = "Builds -${classifier} archive containing all " + "XSDs for deployment at http://springframework.org/schema." duplicatesStrategy 'exclude' moduleProjects.each { subproject -> def Properties schemas = new Properties(); subproject.sourceSets.main.resources.find { it.path.endsWith("META-INF\\spring.schemas") }?.withInputStream { schemas.load(it) } for (def key : schemas.keySet()) { def shortName = key.replaceAll(/http.*schema.(.*).spring-.*/, '$1') assert shortName != key File xsdFile = subproject.sourceSets.main.resources.find { it.path.endsWith(schemas.get(key).replaceAll('\\/','\\\\')) } assert xsdFile != null into (shortName) { from xsdFile.path } } } }
到现在编译前的准备工作才算完成。
05
根据文档步骤进行构建项目
打开 Spring 工程的 import-into-idea.md 文件:
import-into-idea.md 里面详细的描述了编译步骤,根据文档里面介绍,我们需要对 spring-core 和 spring-oxm 做预编译。
预编译:
在 IDEA 中预编译很简单,按下图操作即可:
注意:如果右侧没有 Gradle 那么可以在 View 中让它显示
出现如下图所示,表示预编译成功。
上边的过程演示了 spring-oxm 的预编译,spring-core 和它同理这里就不演示了,成功显示如下图即可。
终极编译:
对整个 Spring 项目构建,这个时候它会自动下载依赖包,如果有异常,会在控制台抛出并停止操作,编译整个工程,需要的时间很长很长。
构建成功在控制台可以看到下图提示
06
执行单元测试
即使整个项目没有 Error 或者红点,也不代表项目已经成功构建好了,我们还需要执行个单元测试试下,如果能顺利执行单元测试,那证明该项目已经构建成功,这里我用到的是 DispatcherServletTests 这个类,直接运行查看结果:
我第一次执行的时候报错了,错误如下:
网上找了很多解决办法还是没用
比如这个:
结果出来的错误更离谱,网上根本找不到相关示例,最后实在是找不到只能重新再来一次
还有这个:
这个还是不行,虽然报错没有更离谱,但是还是会有错误,只是错误没有改变罢了
还有这个:
这个还是不行,把这个类注释掉,那么还会有其他类报错,最后根本注释不完
最后我也找了很久,终于让我找到了
视频参考:
https://www.bilibili.com/video/av76404922
解决办法就是将找不到符号的那个类的子模块的 build 文件删除,再次重新 build 一遍即可,如果还是不行那么把该模块的 text 文件中的代码重新运行 run 一遍,之后再运行测试类即可。之后如果还是显示找不到符号,重复上述步骤即可。
看完视频我的使用视频中的方式,之后还是会有其他的报错,但是报的错都是找不到符号,我还是使用同样的方法,进行重新 rebuild,之后再将 text 中的类重新运行 run 一遍即可。
很明显,上面单元测试类的所有单测执行成功。
当我第二次安装的时候又遇到了不一样的坑
在编译 spring-aspect 的 javadoc 时我等了半个多小时还是不动,之后又重新弄了很多次,还是不行。
解决:注释掉 build.gradle 中的一些代码
// javadoc {// description = "Generates project-level javadoc for use in -javadoc jar"//// options.encoding = "UTF-8"// options.memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PROTECTED// options.author = true// options.header = project.name// options.use = true// options.links(project.ext.javadocLinks)// options.addStringOption("Xdoclint:none", "-quiet")//// // Suppress warnings due to cross-module @see and @link references.// // Note that global 'api' task does display all warnings.// logging.captureStandardError LogLevel.INFO// logging.captureStandardOutput LogLevel.INFO // suppress "## warnings" message// } task sourcesJar(type: Jar, dependsOn: classes) { duplicatesStrategy = DuplicatesStrategy.EXCLUDE classifier = "sources" from sourceSets.main.allSource // Don't include or exclude anything explicitly by default. See SPR-12085. } // task javadocJar(type: Jar) {// classifier = "javadoc"// from javadoc// } artifacts { archives sourcesJar// archives javadocJar }}
07
其他坑
构建成功没报错,但运行单元测试有异常 ,提示类找不到
方案1:尝试点击右边菜单栏projects刷新项目,然后对Spring(Root)模块先clean再build一次。
方案2:针对找不到类的模块重新build一次。
方案3:点击Spring(root)模块下的Tasks->other->compileTestJava 执行一遍,针对test类编译一次即可。
构建失败,缺少依赖包
方案1:对Spring(Root)模块先clean再build一次(建议打开VPN,有可能存在某些包下载不成功导致)。
方案2:尝试针对当前模块执行buildDependents。
构建失败,执行gradle task失败
方案1:可能是当前运行环境版本不支持问题,如果不重要的问题,可以注释掉,保证构建正常。
构建失败,编码异常
方案1:可以通过idea工具设置:Editor-File encodings 全部设置为UTF-8。
这篇博客还会有一些其他的错误,我只遇到了第一种,其他的没有遇到,如果有人遇到了,希望可以帮到你。
https://blog.csdn.net/mjlfto/article/details/103838447
分享给第一个想到的人