Spring源码编译一次性通过&遇到的坑解决方法
前言
spring源码本地编译,按网上的博客参考资料的操作步骤,总是会出现各种莫名其妙的错误。根据错误信息找解决方案,但在自己的环境下又总是编译不过去。结合参加培训学习Jack老师提供的方法,自己多种方式尝试,最终编译成功了。
为了验证自己的方式是否有失误的地方,全部过程我自己走了大概5遍,详细记录下每个步骤。如果按1天8小时计的话,为了这个源码编译至少花了3~4天时间。我觉得是值得的,为后面的源码阅读扫除一个拦路虎。
仅以此篇记录踩到的坑,为同样想读源码的同学可以在编译这一步少花一些时间,也可以后面源码阅读增加自信心。同时感谢在网上留下博客的同学,给予我相当多的帮助,这也是我想写这篇文章的原因。
参考博客:
https://www.it610.com/article/1295306604677242880.htm
https://www.cnblogs.com/haoxianrui/p/12825586.html
https://www.cnblogs.com/jhj117/p/5455081.html
1.资源及环境说明:
idea 2019.3.3
gradle-5.6.4版本(对源码里面的版本,版本需要一致,否则编译过程会出现各种异常)
jdk1.8 or 以上版本
spring-5.2.8.RELEASE
系统:win7 or 以上
2.下载源码
选择gitee下载速度快,官网速度非常慢,耗时约60s
git clone --branch v5.2.8.RELEASE https://gitee.com/Z201/spring-framework.git
2.1.查看源码gradle版本号
查看文件路径:/gradle/wrapper/gradle-wrapper.properties
对应的gradle版本:gradle-5.6.4-bin.zip

3.gradle下载&配置环境变量
3.1.gradle下载
# gradle 下载地址
https://services.gradle.org/distributions/
选择版本: gradle-5.6.4-bin.zip
下载到本机,并解压到指定路径

3.2.配置环境变量
配置环境变量
变量名:GRADLE_HOME
变量值:A:\java_about\gradle-5.6.4
在Path加上 ;%GRADLE_HOME%\bin

3.3.验证gradle

4.源码配置相关修改
4.1.gradle-wrapper.properties配置修改
目录:spring-framework/gradle/wrapper
修改 distributionUrl=file:///A:/java_about/gradle-5.6.4-bin.zip #(本机的所在路径)

4.2.确认kotlin版本号
先查看idea的kotlin版本,查看路径:File->Setting->Plugins,搜索kotlin,如果还没安装过先安装一下。
我的版本号是1.3.61

4.3.build.gradle配置
目标文件:build.gradle 在根目录下
4.3.1.注释gradle企业约束
因为该plugins不注释,会发生很多不可预期的错误,
搜索关键字:io.spring.gradle-enterprise-conventions
注释如下:
// id 'io.spring.gradle-enterprise-conventions' version '0.0.2'

4.3.2.确认kotlin版本号是否一致
如果不一致,修改成跟idea的kotlin的版本号一样,我的版本号为1.3.61,而Spring-5.2.8.RELEASE对应kotlin的版本号是1.3.72,所以需要修改。需要修改的地方有2处
搜索关键字:kotlin.jvm , kotlin-bom

4.3.3.添加上阿里镜像
为仓库添加上阿里镜像,目的是加快资源下载,编译速度加快。行号约279,在dependencyManagement下的repositories 添加:
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}

4.4.settings.gradle配置
为插件仓库添加上阿里镜像,行号约2,在pluginManagement下的repositories 添加:
maven { url "https://maven.aliyun.com/repository/public" }

4.5.解决gradle build慢问题
目标文件:gradle.properties
1.增加内存分配 -- 这个按本机的内存去分配,我的是16G
org.gradle.jvmargs=-Xmx2048M
2.按需配置
org.gradle.configureondemand=true
3.开启守护进程
org.gradle.daemon=true

5.idea导入源码
依次点击File->New->Project from Existing Sources,选择源码包路径下的build.gradle文件完成源码导入

5.1.idea配置gradle
可以预先打开idea配置,也可在导入过程中去配置(导入后会出现一个进度条,选择backgroud后台运行)
操作路径:File->Setting->Build,Execution,Deployment->Build Tools->Gradle

5.2.导入等待&configure成功
以上设置完成后,就是等待过程了,具体多长时间看网速,我的导入编译完成耗时约11m 57s,一次性成功。
编译日志内容如下:
Starting Gradle Daemon...
Gradle Daemon started in 4 s 477 ms
> Task :buildSrc:compileJava
> Task :buildSrc:compileGroovy NO-SOURCE
> Task :buildSrc:pluginDescriptors
> Task :buildSrc:processResources
> Task :buildSrc:classes
> Task :buildSrc:jar
> Task :buildSrc:assemble
> Task :buildSrc:pluginUnderTestMetadata
> Task :buildSrc:compileTestJava NO-SOURCE
> Task :buildSrc:compileTestGroovy NO-SOURCE
> Task :buildSrc:processTestResources NO-SOURCE
> Task :buildSrc:testClasses UP-TO-DATE
> Task :buildSrc:test NO-SOURCE
> Task :buildSrc:validateTaskProperties
> Task :buildSrc:check
> Task :buildSrc:build
CONFIGURE SUCCESSFUL in 11m 57s

5.3.预编译
在idea底部菜单栏,切到Terminal菜单,输入spring-oxm的预编译命令:
gradlew :spring-oxm:compileTestJava
预编译成功,耗时约 29s:

6.测试
6.1.前置说明
在spring-context添加测试类,测试验证是否能编译通过,拿到实例的对象。
6.2.添加测试实体类
为了快速定位到,先添加测试的package: com.elephant.bean , 创建Student实体类
package com.elephant.bean;
import org.springframework.stereotype.Service;
@Service
public class Student {
private String username = "elephant";
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
6.3.测试配置文件
spring-test.xml ,目录在test/resources,内容如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
<context:component-scan base-package="com.elephant"/>
</beans>
6.4.添加测试类
为了快速定位到,先添加测试的package: com.elephant.test , 创建MyTest类
package com.elephant.test;
import com.elephant.bean.Student;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
@Test
public void test1() {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-test.xml");
Student student = (Student)applicationContext.getBean("student");
System.out.println(student.getUsername());
System.out.println("我获取用户名了:"+student.getUsername());
}
}
6.5.运行测试
在类MyTest 方法 test1() 右击Run,然后等待运行结果。

6.6.运行结果
耗时约 1m 36s
预期结果:成功打印出student的userName , 结果符合预期,成功!
我获取用户名了:elephant
BUILD SUCCESSFUL in 1m 36s
50 actionable tasks: 26 executed, 7 from cache, 17 up-to-date
The remote build cache was disabled during the build due to errors.
18:34:24: Tasks execution finished ':spring-context:cleanTest :spring-context:test --tests "com.elephant.test.MyTest.test1"'.

Spring源码编译一次性通过&遇到的坑解决方法的更多相关文章
- spring源码编译完整步骤拿来即用!
1.版本选择 1)源码版本:spring5.3.x 2)gradle版本:根据spring源码的工程路径:gradle/wrapper/gradle-wrapper.properties文件查看gra ...
- spring5源码编译过程中必经的坑
spring源码编译流程:Spring5 源码下载 第 一 步 : https://github.com/spring-projects/spring-framework/archive/v5.0.2 ...
- 【转】Spring源码编译
原文地址: http://www.flyoung.me/2013/08/02/springcodecompile/ 参考资料: https://github.com/spring-projects/s ...
- 源码编译安装 PHP5.5.0,解决curl_exec访问HTTPS返回502错误的问题(修改PATH路径)
最近碰到一个奇怪的问题, PHP使用 curl_exec 访问 HTTPS 网页时, 返回502错误, 访问HTTP网页时没有问题, 用 echo phpinfo() ; 查看, 支持op ...
- spring源码解析(一) 环境搭建(各种坑的解决办法)
上次搭建spring源码的环境还是两年前,依稀记得那时候也是一顿折腾,奈何当时没有记录,导致两年后的今天把坑重踩了一遍,还遇到了新的坑,真是欲哭无泪;为了以后类似的事情不再发生,这次写下这篇博文来必坑 ...
- MTK8127源码编译出现的错误及相关解决办法
/** * date:2016/8/17 * author: Y.X .YANG */ 按照开发文档提示: 1.MTK提供的开发包目录下有若干个.aa .ab .ac ...的分压缩包.此时应当将这些 ...
- 1.编译spring源码
本文是作者原创,版权归作者所有.若要转载,请注明出处 下载spring源码,本文用的是版本如下: springframework 5.1.x, IDE工具idea 2019.2.3 JAVA ...
- 听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译
源码学习第一步,Spring源码编译 之所以写这么一篇文章是因为群里的小伙伴在编译源码时碰到了问题,再加上笔者自身正准备做一个源码的注释版本,恰好也需要重新编译一份代码,至于为什么要将源码编译到本地就 ...
- Gradle编译Spring源码
使用工具:JDK1.8.0_11.Gradle4.9.idea2018.1.3 1. 配置Gradle Gradle下载地址:https://gradle.org/releases/ 在下载页找到自己 ...
随机推荐
- IDEA 全局搜索 Jar 包中源码内容
引言 项目开发过程中,经常遇到需要在依赖的 Jar 包查看源码,查找类方法和属性,介绍两种在 IDEA 中搜索 Jar 包内容的方式 方式一:双击 SHIFT 快捷键 输入需要查询的类名或方法名 方式 ...
- strcasecmp函数和strncasecmp函数原型
函数说明 strcasecmp()用来比较参数s1和s2字符串,比较时会自动忽略大小写的差异. 返回值 若参数s1和s2字符串相同则返回0.s1长度大于s2长度则返回大于0 的值,s1 长度若小 ...
- redis 和 mysql 的主从复制
1. mysql主从复制 (1) 为什么要做主从复制? 1.在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写 ...
- golang快速入门(六)特有程序结构
提示:本系列文章适合对Go有持续冲动的读者 阅前须知:在程序结构这章,更多会关注golang中特有结构,与其他语言如C.python中相似结构(命名.声明.赋值.作用域等)不再赘述. 一.golang ...
- Django(41)详解异步任务框架Celery
celery介绍 Celery是由Python开发.简单.灵活.可靠的分布式任务队列,是一个处理异步任务的框架,其本质是生产者消费者模型,生产者发送任务到消息队列,消费者负责处理任务.Celery ...
- GO学习-(37) 使用Air实现Go程序实时热重载
使用Air实现Go程序实时热重载 今天我们要介绍一个神器--Air能够实时监听项目的代码文件,在代码发生变更之后自动重新编译并执行,大大提高gin框架项目的开发效率. 为什么需要实时加载? 之前使用P ...
- 在windows上 使用celery 报错
在windows上 使用celery 报错 在windows上 使用celery 报错 ValueError: not enough values to unpack (expected ...
- 如何查看Oracle SID即instance_name 和 dbname区别
SID 和 instance_name是一个实例名字db_name 是数据库名字搞清两个概念,数据库和实例 实例:实例是数据库启动时初始化的一组进程和内存结构 数据库:数据库则指的是用户存储数据的一 ...
- docker磁盘空间清理办法
docker磁盘空间清理办法 前段时间遇到docker磁盘空间太少,无法写入数据的问题.起因是因为我在本地(Mac Pro)运行了多个mysql容器,并且导入了一部分线上数据,最后还没导入完毕就已经没 ...
- XML文件存在中文注释报错问题( 3 字节的 UTF-8 序列的字节 3 无效)
今天在做mybatis项目的时候,给映射文件添加了中文注释后,程序就报错.把中文注释删除后,程序又可以正常执行.解决方法在下文提到. 我的xml映射文件如下: <?xml version=&qu ...