Spring源码5.2.x编译,亲测

一、环境准备及配置

1、编译环境介绍

本文章编译环境:IDEA2019.2.4 + JDK1.8.0.271 + Gradle5.6.4,编译的版本是Spring5.2.x。源码直接下载zip即可,或者clone,这里我介绍的是下载zip。

注意:坑了几个小时,JDK版本是JDK1.8.0.22,导致项目导入IDEA都未成功加载出来。Gradle版本不需要太高,官方推荐的是5.6.4,当然你也可以使用其它版本。

2、配置JDK(略)

3、配置Gradle(重)

3.1、下载Gradle5.6.4压缩包,解压到xx目录。

3.2、配置GRADLE_HOME全局变量

3.3、配置path

3.4、打开cmd,测试配置是否生效

3.5、在D盘新建了一个目录叫repository(方便maven和gradle共用一个仓库,IDEA需要指向这个目录)

3.6、配置GRADLE_USER_HOME,Gradle仓库,如果有Maven,MAVEN_HOME需要改成其它名称,怕和Gradle冲突

3.7、配置Gradle默认镜像,下载加速,仓库中创建init.gradle,并配置内容

allprojects{
    repositories {
        mavenLocal()
        maven { url "https://maven.aliyun.com/nexus/content/groups/public/"}
        def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/public/'
        def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter/'
        def ALIYUN_GOOGLE_URL = 'https://maven.aliyun.com/repository/google/'
        def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin/'
        all { ArtifactRepository repo ->
            if(repo instanceof MavenArtifactRepository){
                def url = repo.url.toString()
                if (url.startsWith('https://repo1.maven.org/maven2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
                    remove repo
                }
                if (url.startsWith('https://jcenter.bintray.com/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
                    remove repo
                }
                if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GOOGLE_URL."
                    remove repo
                }
                if (url.startsWith('https://plugins.gradle.org/m2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."
                    remove repo
                }
            }
        }
        maven { url ALIYUN_REPOSITORY_URL }
        maven { url ALIYUN_JCENTER_URL }
        maven { url ALIYUN_GOOGLE_URL }
        maven { url ALIYUN_GRADLE_PLUGIN_URL }
    }
}

二、预编译前对项目源码改动细节

1、解压Spring5.2.x源码,打开源码目录,修改gradle-wrapper.properties配置文件

2、将未解压的gradle-5.6.4-bin.zip放入wrapper目录中(1、2步操作:预编译的时候,就不需要去下载gradle.zip了)

3、给源码的build.gradle添加镜像,加速下载依赖,在第一行加入如下,第二部分保留源码plugins(去掉所有的apply false,表示应用插件),第三部分加入镜像,内容如下:

buildscript {
    repositories {
        maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
        maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
        google()
        jcenter()
    }
}
​
plugins {
    ...
}
​
allprojects {
    repositories {
        maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
        maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
        google()
        jcenter()
    }
}

找到 build.gradle中的 configure(allprojects) 中的 repositories,将之前的删掉,配置如下:

		repositories {
			mavenLocal()
			//mavenCentral()
			maven { url "https://repo.spring.io/snapshot" }
			maven { url "https://repo.springsource.org/plugins-release" }
			maven { url "https://repo.spring.io/libs-spring-framework-build" }
		}

4、找到settings.gradle注释掉spring-aspect模块

温馨提示:前面的配置都是为了后面不出错或者少出错,或者加快编译速度而做的准备,就跟我们敲代码提前把架构搭好一样,所以耐心配置还是很重要的,特别是Spring源码,很多人编译都未成功,何况去看源码?

三、导入IDEA前的预编译

源码导入IDEA的文档,大概分为编译spring-oxm导入IDEA排除spring-aspects(前面已经做了)三步。

1、打开源码根目录,cmd回车进入命令行窗口

2、输入命令,gradlew.bat :spring-oxm:compileTestJava进行预编译

gradlew.bat :spring-oxm:compileTestJava

3、结果出现BUILD SUCCESSFUL则预编译成功,进入下一环节

开始-耐心等待(前面配置了镜像,配置了gradle-5.6.4-bin.zip这里都用到了)

结束-成功-BUILD SUCCESSFUL 用时多少拼网速

注:出现问题可能网络问题,可以多试几次

四、导入IDEA

1、打开IDEA,导入项目

2、修改IDEA中的Gradle配置(重重重)

3、等待项目Configure build加载完成,如果加载报错啥的,可能就是之前的配置有问题,细节问题不在说。还有一种是JDK版本问题,更换即可。

完成后标志-CONFIGURE SUCCESSFUL-网太卡,用的旧电脑,耗时30min..

五、开始编译

1、直接编译整个项目

跳过测试编译

成功

六、新建模块测试

1、new-Module

2、选择gradle

3、加入依赖

4、创建测试文件

JavaConfig

package xue;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * 组件
 *
 * @author :HUANG ZHI XUE
 * @date :Create in 2020-12-04
 */
@Configuration
@ComponentScan("xue")
public class JavaConfig {
}

SpringBuildTest

package xue;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * 测试类
 *
 * @author :HUANG ZHI XUE
 * @date :Create in 2020-12-04
 */
public class SpringBuildTest {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(JavaConfig.class);
		System.out.println(ac.getBean(JavaConfig.class));
	}
}

运行测试类

七、Github信息

Spring github项目地址:https://github.com/spring-projects/spring-framework/tree/5.2.x

本项目github地址:https://github.com/shenyun499/spring-framework-5.2.x/tree/dev

2022-6-15记录:项目上传时因为aop-target未上传,被.gitignore住了target diretory,目前已经补上,若遇到aop.target相关的异常可能也是因为这个原因!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值