这两天编译了spring源码和springboot源码,也总结出来了这类源码出现问题的排查思路。在这里记录一下,希望小伙伴们少走点弯路。
编译环境
- IDEA 2019, 内置kotlin插件
- spring 5.2.2-release源码
- jdk1.8
- gradle 5.6.4
1. 环境配置
建议使用gitee获取
下载gradle后,配置GRADLE_HOME 。
2. 使用gradle进行编译
- 下载之后,别先使用IDEA进行打开,先使用notepad修改下build.gradle文件和settings.gradle文件
- 搜索
repos ,然后修改成下面内容,两个都要修改。有几个修改几个
maven{ url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven{ url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
因为修改之后就是国内地址了,依赖就很容易下载下来,否则国外的地址,真的真的很难编译成功。梯子有时候也不管用。
- 使用IDEAimport源码文件,然后等待5min左右,会出现build成功的信息。
4. 编译spring-oxm 模块,使用compileTestJava
5. 跳过test模块,在build.gradle 文件中找到test 模块,加入enabled = false 6. 跳过文档生成,搜索arti ,注释掉一下内容。
- 删除格式,找到
根目录->src->chekstyle 文件,从第四行注释到倒数第二行。快捷键[ctrl + /]
真的建议跳过这些东西。因为你不发布,测试和源码生成的文档,基本用不到。但是编译真的烦。各种test模块
- 编译整个项目
跳过模块之后,编译就很快了,3min左右吧。也不会出现堆溢出的问题,需要加JVM参数调节的情况。
测试
- 创建一个gradle模块
- 引入依赖,修改创建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'
}
- 创建下面几个类
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());;
}
}
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);
}
}
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,出现如下成功,如果失败,发现缺失类,请看下面的问题解决。
问题解决思路
编译的时候遇到了很多问题。总结来说分成两类
build阶段
- 各种由于依赖下载不下来的问题
- Exception : org…cannot find
- Exception : Time Out
各种找不到,都是由于类下载不下来导致的。首先看看是不是配置了镜像。如果配置了还是下载不下来,就换网。 但是盲目的重新下载没什么意义。最好看去.gradle 目录下看一下,有没有缺失的类的目录。如果没有,在进行重新编译才有意义。
- test阶段太耗时,太占内存。
- checkStyle
- 文档生成
2,3,4的解决办法已经写在,步骤里面了。这几个错误真的很烦人。因为一旦不设置,编译时常都是5min+,而又经常编译不通过。
2.启动阶段
此时已经编译完成了,每一个模块下,也都有了对应的jar包了,但是仍旧有的模块出现了类找不到的问题。甚至那个找不到的类,你都可以点进去。 比如CoroutinesUtils 类找不到。
此时,一定要看各个模块的build.gradle文件。比如上面的类找不到就是由于 这个类作为compileOnly因为的spring-core模块。修改成compile重新编译spring-core模块就通过了。
错误解决总结。
就一句话:如果出现了错误,首先看是否依赖满足,其次看gradle.build文件的配置是否有问题。
最后
最后,最后,这两天,一直在配编译的环境,真的精疲力尽了已经。甚至到最后有点怀疑人生。
真的感觉配环境没什么技术含量,就那么重复的、死的工作,不断的尝试,不断的试错。枯燥,无聊,痛苦、绝望。
而且,而且有时候,网络不行,就算你的步骤都对,也一样配不成功。这就是所谓的有志与力,而无网以相之,亦不能至也吧。
并且,并且,以前我还不知道有国内镜像这东西,一直用的蹩脚的梯子。想起我大二时候,一直进行这种重复,无聊,并且基本不可能成功(没网)的工作,就有点心疼。也有点恨铁不成钢,因为太爱转牛角尖了,没有想过用其他办法解决问题。总是期盼着电脑能够突然好起来,然后一次又一次重复着错误的方法。
回到现在,这更像是一种对过去的自己提交的答案,和对过去自己的安慰。因为这一直是自己的一个遗憾。虽然编译完源码之后,很可能不会继续深入学习SSM框架了。但是完成了这个遗憾,也不算浪费时间吧?
以后想搞大数据的了,很可能又是一个错误的选择。选择学习计算机,是第一个错误。大数据火,想搞大数据是第二个。这个也算是为自己留的一条后路吧。以后大数据找不到工作的时候,最起码,还有spring源码的阅读经验,是不是听起来也挺唬人的? 虽然,我只看到了Bean创建的过程了,和spring这个大beanFactory,这一个层次。
真想找个女朋友啊,但是想起自己这么菜,连个大厂都进不去,谈什么女朋友。好好卷,好好搞钱吧。
在csdn这种同性交流圈里,发这种无病呻吟的东西,也确实有点脑残了。但是浪费了差不多两天时间,发一下牢骚,总是让人理解的吧。
|