【spring】 spring-5.0.x源码本地编译

1,486 阅读3分钟

前言

描述版本号
操作系统win10
jdk1.8.0_102
gradle4.9
spring5.0.x

相关包在分享的网盘中

****链接:https://pan.baidu.com/s/1qDk4H9g5yGyrOOurXBGt7Q 
提取码:lnt5 

安装gradle

下载gradle

services.gradle.org/distributio…

其它版本,试了很多,就这个编译通过,测试通过

配置gradle

下载下来后解压

配置环境变量

GRADLE_HOME

GRADLE_USER_HOME

配置镜像加速

参考:juejin.cn/post/707703…

验证gradle

下载spring源码

版本是5.0.x,其它版本的试了几个,没成功

github.com/spring-proj…

修改spring源码配置

spring源码下载下来后,不着急导入idea,先修改几处配置

配置gradle的远程仓库

打开spring源码的gradle配置文件

如下两处添加镜像源配置

      // 配置国内镜像源
      maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/' }
      maven{ url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}

配置源码使用的gradle版本

distributionUrl=file:///E:/yuanma/gradle-4.9-all.zip

这里的distributionUrl的值指向我们下载的gradle-4.9-all.zip压缩包

修改spring-beans.gradle文件配置

注释掉部分报错配置,替换成新的配置

def deps = compileGroovy.taskDependencies.immutableValues + compileGroovy.taskDependencies.mutableValues
compileGroovy.dependsOn = deps - "compileJava"
compileKotlin.dependsOn(compileGroovy)
compileKotlin.classpath += files(compileGroovy.destinationDir)

导入idea

做完上述步骤,就可以将项目导入idea了

等待下载好依赖,在gradle控制面板中即可看到导入的spring的各个模块

编译oxm、编译core

要编译整个spring的源码,我们需要预先编译 spring-oxm和spring-core

在gradle面板中找到如下按钮,点击即可编译oxm模块

编译结果如下:

我这里因为已经编译过了,所以会比较快

同理,编译core模块

编译结果如下:

编译整个spring源码

确保oxm和core模块编译成功后,即可编译spring整体

编译结果如下:

我这里因为已经编译过了,所以会比较快,初次编译的话,大概在半个小时的样子(实际上我等了1个半小时。。。),如果不配置国内的镜像源的话,根本就编译不通过。

到这里的话,其实spring的编译就完成了。项目的整体结构如下,并且各个模块在idea中都有一个蓝色的小标

打开 ApplicationContext 类,选中类名,按快捷键 ctr + alt + shift + u,可生成 ApplicationContext类的UML继承图

新建测试模块测试

新建spring-jiuge子模块

修改spring-jiuge模块的build.gradle文件,新增依赖

    compile(project(":spring-beans"))
    compile(project(":spring-core"))
    compile(project(":spring-context"))
    compile(project(":spring-aop"))

新建包 com.jiuge、以及类 User、JavaConfig、App,代码如下

User.java

package com.jiuge;

/**
 * @author 九歌
 * @history 2021/2/22 新建
 * @since JDK1.8
 */
public class User {


	private String userName;

	public User(String userName) {
		this.userName = userName;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}
}

JavaConfig.java

package com.jiuge;

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

/**
 * @author 九歌
 * @history 2021/2/22 新建
 * @since JDK1.8
 */
@Configuration
@ComponentScan
public class JavaConfig {

	@Bean
	public User user(){
		return new User("九歌");
	}
}

App.java

package com.jiuge;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * @author 九歌
 * @history 2021/2/22 新建
 * @since JDK1.8
 */
public class App {

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

运行App.java类中的main方法,能输出对应的user对象的userName字段的值 “九歌” 即可,如下:

如此,spring-5.0.x编译、测试通过。

附录--问题记录

上述编译过程,在公司电脑上进行,回家后,拿自己的电脑,照着上述步骤进行第二次编译,还是遇到了一些问题。

项目导入idea后,无法下载插件

导入idea中后,自动编译,提示无法下载插件 id "com.gradle.build-scan" version "1.8",按提示点击 Open File 定位到 id "com.gradle.build-scan" version "1.8"位置,如下图:

解决步骤:

  1. 将插件部分注释掉,触发编译

  1. 此时,触发编译,会提示报错,如下:

  1. 重新打开被注释掉的插件,重新触发编译即可解决问题。

如果仍然无法解决,可试试以下方法,打开控制台运行 gradle build -x test -x javadocjar ,会自动下载相关jar, 如图:

oxm、core编译通过后,编译整个spring项目,耗时巨长

解决步骤:

  1. 注释掉build.gradle中的部分task,不在进行doc文档的编译,如下图:

  1. 注释掉docs.gradle文件中的dokka部分和asciidoctor部分,如下图:

注释掉以上部分后,编译时间缩短为几分钟