这两天编译了spring源码和springboot源码,也总结出来了这类源码出现问题的排查思路。在这里记录一下,希望小伙伴们少走点弯路。

编译环境

  • IDEA 2019, 内置kotlin插件
  • spring 5.2.2-release源码
  • jdk1.8
  • gradle 5.6.4

1. 环境配置

建议使用gitee获取

下载gradle后,配置GRADLE_HOME

2. 使用gradle进行编译

  1. 下载之后,别先使用IDEA进行打开,先使用notepad修改下build.gradle文件和settings.gradle文件
  2. 搜索repos,然后修改成下面内容,两个都要修改。有几个修改几个
maven{ url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven{ url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }

因为修改之后就是国内地址了,依赖就很容易下载下来,否则国外的地址,真的真的很难编译成功。

  1. 使用IDEAimport源码文件,然后等待5min左右,会出现build成功的信息。

springdoc修改地址 修改spring源码_gradle

springdoc修改地址 修改spring源码_gradle_02

springdoc修改地址 修改spring源码_springdoc修改地址_03


4. 编译spring-oxm模块,使用compileTestJava

springdoc修改地址 修改spring源码_spring boot_04


springdoc修改地址 修改spring源码_springdoc修改地址_05


5. 跳过test模块,在build.gradle文件中找到test模块,加入enabled = false

springdoc修改地址 修改spring源码_spring boot_06


6. 跳过文档生成,搜索arti,注释掉一下内容。

springdoc修改地址 修改spring源码_springdoc修改地址_07


  1. 删除格式,找到根目录->src->chekstyle文件,从第四行注释到倒数第二行。快捷键[ctrl + /]
  2. springdoc修改地址 修改spring源码_User_08


springdoc修改地址 修改spring源码_gradle_09

真的建议跳过这些东西。因为你不发布,测试和源码生成的文档,基本用不到。但是编译真的烦。各种test模块

  1. 编译整个项目

跳过模块之后,编译就很快了,3min左右吧。也不会出现堆溢出的问题,需要加JVM参数调节的情况。

测试

  1. 创建一个gradle模块

springdoc修改地址 修改spring源码_spring boot_10


springdoc修改地址 修改spring源码_spring boot_11

  1. 引入依赖,修改创建moudle的build.gradle
dependencies {
    compile(project(":spring-core"))
    compile(project(":spring-aop"))
    compile(project(":spring-beans"))
    compile(project(":spring-context"))
    testCompile group: 'junit', name: 'junit', version: '4.12'
}
  1. 创建下面几个类
  • User类
public class User {

	int id;
	String name;
	int age;

	public User(int id, String user, int age) {
		this.id = id;
		this.name = user;
		this.age = age;
	}

	User() {

	}

	@Override
	public String toString() {
		String ans = "{id:" + id + ",name: " + name + ",age:" + age + "}";
		return ans;
	}

	public static void main(String[] args) {
		User user = new User(1, "fuzekun", 13);
		System.out.println(user.toString());;
	}
}
  • JavaConfig类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JavaConfig {

	@Bean
	public User user() {
		return new User(1, "fuzekun", 23);
	}

}
  • Main类
import jdk.nashorn.internal.runtime.regexp.joni.ApplyCaseFoldArg;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;



public class Main {

	public static void main(String[] args) {
		ApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);
		User user = (User) context.getBean("user");
		System.out.printf(user.toString());
	}
}

然后直接运行main,出现如下成功,如果失败,发现缺失类,请看下面的问题解决。

springdoc修改地址 修改spring源码_spring_12

问题解决思路

编译的时候遇到了很多问题。总结来说分成两类

  • build阶段
  • 启动阶段

build阶段

  1. 各种由于依赖下载不下来的问题
  • Exception : org…cannot find
  • Exception : Time Out

各种找不到,都是由于类下载不下来导致的。首先看看是不是配置了镜像。如果配置了还是下载不下来,就换网。

但是盲目的重新下载没什么意义。最好看去.gradle目录下看一下,有没有缺失的类的目录。如果没有,在进行重新编译才有意义。

springdoc修改地址 修改spring源码_spring_13

springdoc修改地址 修改spring源码_User_14

  1. test阶段太耗时,太占内存。
  2. checkStyle
  3. 文档生成

2,3,4的解决办法已经写在,步骤里面了。这几个错误真的很烦人。因为一旦不设置,编译时常都是5min+,而又经常编译不通过。

2.启动阶段

此时已经编译完成了,每一个模块下,也都有了对应的jar包了,但是仍旧有的模块出现了类找不到的问题。甚至那个找不到的类,你都可以点进去。
比如CoroutinesUtils类找不到。

springdoc修改地址 修改spring源码_gradle_15


此时,一定要看各个模块的build.gradle文件。比如上面的类找不到就是由于

这个类作为compileOnly因为的spring-core模块。修改成compile重新编译spring-core模块就通过了。

springdoc修改地址 修改spring源码_spring boot_16

错误解决总结。

就一句话:如果出现了错误,首先看是否依赖满足,其次看gradle.build文件的配置是否有问题。

最后

最后,最后,这两天,一直在配编译的环境,真的精疲力尽了已经。甚至到最后有点怀疑人生。

真的感觉配环境没什么技术含量,就那么重复的、死的工作,不断的尝试,不断的试错。枯燥,无聊,痛苦、绝望。

而且,而且有时候,网络不行,就算你的步骤都对,也一样配不成功。这就是所谓的有志与力,而无网以相之,亦不能至也吧。

并且,并且,以前我还不知道有国内镜像这东西。想起我大二时候,一直进行这种重复,无聊,并且基本不可能成功(没网)的工作,就有点心疼。也有点恨铁不成钢,因为太爱转牛角尖了,没有想过用其他办法解决问题。总是期盼着电脑能够突然好起来,然后一次又一次重复着错误的方法。

回到现在,这更像是一种对过去的自己提交的答案,和对过去自己的安慰。因为这一直是自己的一个遗憾。虽然编译完源码之后,很可能不会继续深入学习SSM框架了。但是完成了这个遗憾,也不算浪费时间吧?

以后想搞大数据的了,很可能又是一个错误的选择。选择学习计算机,是第一个错误。大数据火,想搞大数据是第二个。这个也算是为自己留的一条后路吧。以后大数据找不到工作的时候,最起码,还有spring源码的阅读经验,是不是听起来也挺唬人的? 虽然,我只看到了Bean创建的过程了,和spring这个大beanFactory,这一个层次。

真想找个女朋友啊,但是想起自己这么菜,连个大厂都进不去,谈什么女朋友。好好卷,好好搞钱吧。