Idea和gradle编译spring5源码以及出现问题解决方案


对于想深入研究spring源码的,肯定会下载源码运行调试。那就得搭建环境。
下面记录下搭建环境过程以及遇到的坑。
注意:一定要注意版本一致性!

版本工具

版本工具:Spring5.0.4.RELEASE,gradle4.9bin,jdk1.8.0,Intellij IDEA
1、spring源码下载
下载spring源码,可以从spring官方的github库中进行下载。
spring各个版本的下载链接。下载地址

由于GitHub地址下载慢,这里提供本次编译的源码下载地址。
链接:百度云
提取码:djmy

2、gradle4.9下载
链接: 官网下载地址
链接:百度云
提取码:cknc

3、jdk下载
jdk各个版本下载地址
https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html
本次使用jdk下载地址
链接:百度云
提取码:s3rp

搭建过程

配置jdk

可以选择自己的版本
配置过程: JDK安装与环境变量配置

配置gradle

根据源码确定gradle的版本
打开你spring源码的目录gradle\wrapper\gradle-wrapper.properties查看。

下载解压可以看到如下目录结构
在这里插入图片描述

1、在系统变量中新建变量
GRADLE_HOME
在这里插入图片描述
2、GRADLE_USER_HOME
在这里插入图片描述
3、编辑Path,加入路径如下图所示,点击保存
在这里插入图片描述
4、验证是否配置成功,进入cmd后,输入gradle -v,显示如下 环境配置
在这里插入图片描述
5、打开文件夹->新建文件init.gradle->添加如下内容

allprojects{
    repositories {
        def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/'
        all { ArtifactRepository repo ->
            def url = repo.url.toString()
            if ((repo instanceof MavenArtifactRepository) && (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
        }
    }
}

源码

先配置源码保存版本一致性和提高下载速度
1、编辑源码根目录下的build.gradle
先查看版本号
在这里插入图片描述
修改文件
在这里插入图片描述
2、源码下配置远程仓库
根目录下的build.gradle:
添加信息
maven{ url ‘http://maven.aliyun.com/nexus/content/groups/public/’}
在这里插入图片描述

Idea配置编译

导入IDEA
1、打开源码中import-into-idea.md文件
在这里插入图片描述
操作步骤:
File -> New -> Project from Existing Sources -> 找到选择spring-framework源码 -> 选择build.gradle

2、配置idea
配置本地gradle
使用工具编译时,可能会出现内存溢出情况,这里我们编译时需要增加相关参数
-XX:MaxPermSize=2048m -Xmx2048m -XX:MaxHeapSize=2048m
在这里插入图片描述
以上工作完成之后,我们可以开始编译配置
项目编译顺序:core-oxm-context-beans-aspects-aop
在这里插入图片描述
开始编译
在这里插入图片描述

遇到各种问题以及解决方案

1、Circular dependency between the following tasks
在这里插入图片描述
解决方案:修改spring-beans.gradle
将 spring-beans.gradle 最后三行替换成:

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

在这里插入图片描述

2、Gradle打包问题Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0
打开gradle-wrapper.properties
修改gradle版本
在这里插入图片描述
点击build的刷新按钮,重新build
3、找不到InstrumentationSavingAgent
找到引入InstrumentationSavingAgent所在模块的地方。spring-context.gradle
把optional修改为compile。下图就是修改后的效果。再重新build。
在这里插入图片描述
4、修改docs.gradle文件
打开文件spring\gradle\docs.gradle
注释掉dokka和asciidoctor两个配置项,主要用来生成文档的。
在这里插入图片描述
在这里插入图片描述
替换docs.gradle文件中的task schemaZip配置,在windows环境需要替换成""。
将原来的 task schemaZip注释。替换如下代码:

task schemaZip(type: Zip) {
	group = "Distribution"
	baseName = "spring-framework"
	classifier = "schema"
	description = "Builds -${classifier} archive containing all " +
			"XSDs for deployment at http://springframework.org/schema."
	duplicatesStrategy 'exclude'
	moduleProjects.each { subproject ->
		def Properties schemas = new Properties();

		subproject.sourceSets.main.resources.find {
			it.path.endsWith("META-INF\\spring.schemas")
		}?.withInputStream { schemas.load(it) }

		for (def key : schemas.keySet()) {
			def shortName = key.replaceAll(/http.*schema.(.*).spring-.*/, '$1')
			assert shortName != key
			File xsdFile = subproject.sourceSets.main.resources.find {
				it.path.endsWith(schemas.get(key).replaceAll('\\/','\\\\'))
			}
			assert xsdFile != null
			into (shortName) {
				from xsdFile.path
			}
		}
	}
}

在这里插入图片描述

测试源码

等待编译完成。
在这里插入图片描述
测试项目是否可用。
在源码项目new一个moudle,类型为gradle的管理的java项目即可
在这里插入图片描述
项目创建完成后,目录以及结构如下。
在这里插入图片描述
该项目下build.gradle添加compile project(":spring-context")
在这里插入图片描述
SpringConfig
在这里插入图片描述
TestDao
在这里插入图片描述
测试结果
运行Test.java,出现下图即证明spring5项目编译成功!
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值