001、spring-framework源码环境搭建

3 篇文章 0 订阅
1 篇文章 0 订阅

最近开始学习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/
gradle官网历史版本
这里下载最新版本5.6.3的二进制压缩包到本地,解压之后进行环境变量配置

2.2. gradle环境变量配置

gradle有两个环境变量需要设置:
GRADLE_HOME:gradle的家目录;
GRADLE_USER_HOME:gradle的仓库目录,如果不设置这个环境变量,运行gradle的时候,将会把需要的jar包下载到c盘的当前用户目录下的.gradle目录下,随着以后的使用这个目录会变的越来越大,所以建议设置该环境变量。
这两个环境变量如下图:
gradle的两个环境变量
接着设置path环境变量:
path环境变量增加:%GRADLE_HOME%\bin
如下图:
gradle的path环境变量
配置gradle远程仓库的地址到阿里云,默认是maven中心地址,网速比较慢
gradle配置阿里云仓库
在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环境变量配置
可以看到,正确输出了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压缩包。
如下图:spring源码仓库
spring源码压缩包
下载好之后解压到一个我们的工作目录里,下边就是配置调整一在idea的gradle的配置。

4. idea的配置

打开我们安装的的idea,我用的是2018.3.6的版本,如果谁有需要可以找我,给我留言。
打开之后到idea的欢迎页面,按照下图进行设置

4.1. 配置gradle

idea配置
idea配置
这里就是我们配置的GRADLE_USER_HOME环境变量的路径,就是gradle的仓库,idea会自动读取出来,如果没有配置,可以自己指定一个,但是自己指定的话就只有idea才会生效。

4.2. 配置JDK

我是用的jdk1.8.0_211。
idea的jdk配置
idea的jdk配置
这里如果没有的话可以选new自己指定一个,一般会直接读出来配置的jdk环境变量。

5. idea打开并编译spring源码

idea打开spring源码并编译。

5.1. 打开spring源码

打开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加载完成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大神。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值