最近开始学习spring源码,搭建spring源码环境废了好一番功夫,这里记录下搭建流程,以作后记。
1. 使用工具和版本
jdk1.8.0_211,gradle-5.6.3,idea2018.3.6,spring-framework-5.1.x,win10
2. gradle安装配置
jdk的配置这里就不说了,相信大家都能安装好的,这里说一下gradle的安装配置,因为本人以前都是用的maven,而spring源码是基于gradle进行jar包管理和构建的,我对gradle并不熟悉,所以记录一下。
2.1. gradle下载
gradle官网历史版本的地址
https://gradle.org/releases/
这里下载最新版本5.6.3的二进制压缩包到本地,解压之后进行环境变量配置
2.2. gradle环境变量配置
gradle有两个环境变量需要设置:
GRADLE_HOME:gradle的家目录;
GRADLE_USER_HOME:gradle的仓库目录,如果不设置这个环境变量,运行gradle的时候,将会把需要的jar包下载到c盘的当前用户目录下的.gradle目录下,随着以后的使用这个目录会变的越来越大,所以建议设置该环境变量。
这两个环境变量如下图:
接着设置path环境变量:
path环境变量增加:%GRADLE_HOME%\bin
如下图:
配置gradle远程仓库的地址到阿里云,默认是maven中心地址,网速比较慢
在init.d这个目录下新建名为init.gradle的文件,添加如下内容
allprojects{
repositories {
def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/'
all { ArtifactRepository repo ->
if(repo instanceof MavenArtifactRepository){
def url = repo.url.toString()
if (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
}
}
}
就像linux的rc.local文件在linux启动的时候被加载一样,init.d目录里边的内容也会在gradle被启动是时候被加载。
测试一下gradle环境是否配置成功,调出一个新的cmd窗口,输入gradle -v,
如下图:
可以看到,正确输出了gradle的版本号,以及java版本,系统版本等,并且可以查看到gradle的依赖的jar包仓库下载到了我们设置的GRADLE_USER_HOME环境变量下,而不是默认的c盘下。
3. spring-framework源码下载
spring-framework是一个开源项目,源码存放在github上,谁都可以去下载。
地址:https://github.com/spring-projects/spring-framework
在源码仓库我们切换到5.1.x分支,下载zip压缩包。
如下图:
下载好之后解压到一个我们的工作目录里,下边就是配置调整一在idea的gradle的配置。
4. idea的配置
打开我们安装的的idea,我用的是2018.3.6的版本,如果谁有需要可以找我,给我留言。
打开之后到idea的欢迎页面,按照下图进行设置
4.1. 配置gradle
这里就是我们配置的GRADLE_USER_HOME环境变量的路径,就是gradle的仓库,idea会自动读取出来,如果没有配置,可以自己指定一个,但是自己指定的话就只有idea才会生效。
4.2. 配置JDK
我是用的jdk1.8.0_211。
这里如果没有的话可以选new自己指定一个,一般会直接读出来配置的jdk环境变量。
5. idea打开并编译spring源码
idea打开spring源码并编译。
5.1. 打开spring源码
这里选到我们解压的spring-framework的目录,点击ok,只有如下图:
1.这里选中Use Local gradle distribution,意思是使用本地gradle环境,而不是使用idea自带的或者项目指定的
2.选中1之后指定gradle home,这里一般会直接读取环境变量配置的GRADLE_HOME,如果没有也可以自己指定。
3.指定gradle使用的jvm。
4.指定当前项目的gradle的仓库地址,一般也会直接读取环境变量GRADLE_USER_HOME的值,当然也可以自己指定,但是只对当前项目生效。
配置完成之后点击ok打开spring源码,idea就开始自动执行一些配置,生成idea的项目配置目录等。
idea加载spring可能由于一些网络原因会特别慢,稍等片刻。
这是idea加载完成spring源码的样子,之后就可以对idea进行编译了。
5.2. 编译spring源码
spring源码里的import-into-idea.md文件有对idea导入的一些介绍,我们看一下
这里大致(本人英语不咋地,就看出来大致)意思是说spring-core和spring-oxm两个模块被其他模块依赖,应该先被编译;spring-aspects模块在idea里有一些没有被发现的问题会导致报错,应该从项目里移除掉,不过我的源码环境spring-aspects模块并没有报错,也许是我还没有用到这个模块。
那下面我们就先编译spring-core和spring-oxm两个模块。
如下图:双击compileJava
spring-core编译完成之后会在spring-core目录下生成build目录,最主要的是libs目录下会多spring-cglib-repack-3.2.11.jar,spring-objenesis-repack-3.0.1.jar两个jar包,如果没有这两个jar包,spring-core模块是会报错的。
同样的方法编译spring-oxm模块,如下图:
接下来编译spring整个项目,这个过程非常耗时间,其实完全没有必要,只是我们用到那个模块编译那个模块就够了。
6. 新建一个模块测试一下
6.1 新建模块
在项目根目录上右键,新建一个模块
6.2. 模块设置
选中gradle,勾选Java,指定SDK,点击next
6.3. 指定模块名称,点击next
6.4. 点击finish
6.5. 引入spring-context包
在dependencies下面新增一行
compile(project(":spring-context"))
然后点击import Changes
加载完成可以看到spring-context包已经引入进来了。
6.6. 新建测试包测试类
测试包:com.spring.hello
测试类:User.java,HelloSpring.java
package com.spring.hello;
import org.springframework.stereotype.Component;
/**
* @author: jpfly
* @create: 2019-10-19 23:33
**/
@Component
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.spring.hello;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @author: jpfly
* @create: 2019-10-19 23:34
**/
public class HelloSpring {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.scan("com.spring.hello");
context.refresh();
User bean = context.getBean(User.class);
System.out.println(bean);
}
}
运行main方法,main上右键
这里报错,需要编译一下spring-context模块,这里我运行了一下spring-context的单元测试,会把所有的java文件编译为class文件。
再次运行main方法
这一次成功输出了,大功告成。
7. JDK版本的坑
我开始用的是jdk1.8.0_31,不管怎么编译都是报下图的错,我通过查询资料,发现jdk的一些小版本存在未知问题(我没搞明白什么问题,如果谁知道可以告诉我,我后续知道了也会回来补充),最后换成jdk1.8.0_211才编译通过。
好了,spring源码环境的搭建到此结束,这是我多次操作之后得出的一个流程,希望照此操作的人能够一次成功,如果谁有什么问题可以给我留言,我要开始spring源码的学习之旅了,也祝大家早日成为spring大神。