相信很多小伙伴都阅读过spring的源码,但是搭建spring源码阅读及调试环境的时候应该踩过不少坑吧,在这里特意记录一下整个过程,留给有需要的人看吧,好了,那我们就开始吧。
准备
spring源代码下载
首先下载spring框架源代码,可以从GitHub或者Gitee上下载,本文下载的spring版本是5.3.7。
-
GitHub地址:https://github.com/spring-projects/spring-framework.git -
Gitee地址:https://gitee.com/mirrors/Spring-Framework_old1.git(这个国内的会快一些)
gradle下载
spring框架使用gradle进行构建和jar包管理,使用gradle这个构建工具的主要原因是减少项目构建所需要的时间,gradle比maven要快,所以需要先下载gradle和配置gradle。
-
官网地址:https://gradle.org/
注意:gradle和spring是有版本关联的,建议根据spring源码里的gradle版本进行下载和配置,不然会产生很多麻烦。
可以在spring源码里找到使用的gradle版本,路径:Spring-Frameworkgradlewrappergradle-wrapper.properties,这里我们可以看到spring5.3.7版本可以使用gradle6.8.3版本。安装步骤:
-
下载完gradle解压存放目录最好不要有中文,然后配置环境变量。 -
配置到系统变量 右键点击电脑>属性>高级系统设置>高级>环境变量>系统变量
2.1 新建变量 GRADLE_HOME=D:softgradle-6.8.32.2 加入到环境变量Path里 %GRADLE_HOME%bin
-
使用gradle -v命令确认是否安装配置成功,如下所示即gradle安装完成。
JDK
这里jdk版本建议使用jdk11以上的啊,jdk8版本的话可能编译的时候会有类找不到的情况,jdk的下载和安装可自行网上搜索,不再本次内容里。
IDEA
建议使用高版本的IDEA,我使用的是idea2022.3.2版本,低版本的可能会涉及版本不兼容的问题,比如低版本的不支持jdk11或者跟gradle插件版本不兼容等问题。我是在idea3019.3.4折腾了一天,最后发现是gradle插件版本不兼容的问题导致编译不成功,换成idea2022.3.2版本就解决了。
版本不对的话会提示各种错误,比如 如果Gradle版本不对,会报各种各样的错误,比如:
-
(1)Only Project build scripts can contain plugins {} blocks -
(2)This version of the JMH Gradle plugin requires Gradle 6+
可以从idea安装路径里看gradle版本,IntelliJ IDEA 2019.3.4pluginsgradlelib,这里我们看到idea2019.3.4版本使用的是gradle5.x的版本IntelliJ IDEA 2022.3.2pluginsgradlelib,这里我们看到idea2022.3.2版本使用的是gradle7.x版本,比我使用的6.8.3版本的gradle高,是兼容的。准备阶段完成,接下来我们开始折腾spring源码吧。
spring源码配置调整
spring源码里有些配置可以调整下,这样可以加快我们的编译速度,主要是选用国内的仓库。
-
调整spring源码目录下,gradlewrappergradle-wrapper.properties文件的distributionUrl,spring默认是从官网下载的gradle,比较慢,因为之前我们自己已经安装了,所以可以换成我们自己的地址。
更改distributionUrl,换成我们本地的地址,如下:
-
在源码目录下,build.gradle文件中,我们替换一下仓库地址,使用阿里云的镜像地址会快些。
把这个repositories修改成这样
repositories {
// 新增2个阿里镜像地址
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/repository/spring' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
mavenCentral()
maven { url "https://repo.spring.io/libs-spring-framework-build" }
// 新增spring插件库
maven { url "https://repo.spring.io/plugins-release"}
}
-
在源码目录下,settings.gradle文件里同样替换一下repositories。
把这个repositories修改成这样
pluginManagement {
repositories {
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
maven { url "https://maven.aliyun.com/repository/public" }
gradlePluginPortal()
maven { url 'https://repo.spring.io/plugins-release' }
}
}
-
在源码目录下,gradle.properties调整一下jvm堆大小以及gradle后台执行
修改:org.gradle.jvmargs=-Xmx2048M 新增:org.gradle.configureondemand=true org.gradle.daemon=true 这样我们需要修改的配置就完成了。
导入IDEA编译调试
接下来我们就按源码目录下import-into-idea.md这个文档的操作步骤导入到idea里吧。
-
编译oxm
在源码目录下,打开cmd窗口,执行命令:gradlew :spring-oxm:compileTestJava,看到绿色的BUILD SUCCESSFUL就说明执行成功啦。
-
打开idea并导入,File -> New -> Project from Existing Sources -> Navigate to directory -> Select build.gradle
这里要说的是,导入时我们先停止build,先做下配置
-
打开idea的gradle工具栏,把spring-aspects忽略掉
-
然后刷新gradle,等待依赖包下载完成。
-
编译,找到gradle工具栏,双击spring->Tasks->build->build执行整个工程的编译
编译需要一段时间,看到“BUILD SUCCESSFUL”即编译成功。
-
新建一个demo工程
到这里源码编译就完成了,接下来我们创建一个自己的工程,引用spring的相关模块,看看运行结果吧 选择File菜单,点击Project Structure,点击+,新建一个gradle项目,输入项目名下一步输入包名、存放路径等信息后就完成了。修改demo工程的build.gradle,完整如下:
plugins {
id 'java'
}
group 'org.springframework'
version '5.3.7-SNAPSHOT'
dependencies {
compile(project(":spring-beans"))
compile(project(":spring-core"))
compile(project(":spring-context"))
testCompile group: 'junit', name: 'junit', version: '4.12'
}
先写一个service类:
package com.star95.springframework.service;
import org.springframework.stereotype.Service;
@Service
public class TestService {
public void sayHello() {
System.out.println("hello spring!");
}
}
再写一个扫描配置类:
package com.star95.springframework.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@ComponentScan("com.star95.springframework")
@Configuration
public class CommonConfig {
}
最后写一个测试类:
package com.star95.springframework;
import com.star95.springframework.config.CommonConfig;
import com.star95.springframework.service.TestService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class AnnotationContextTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(CommonConfig.class);
TestService testService = (TestService) context.getBean("testService");
testService.sayHello();
}
}
好了,这时候就可以运行了,接下来我们看看常见的错误以及如何处理吧。
错误1:Kotlin: warnings found and -Weeror specified
网上有的说缺少 cglib 和 objenesis 包需要重新编译,双击这两个task即可。但是貌似不生效,这时可以找到spring-context,spring-core,spring-beans这几个module,点击main下的Kotlin,把右面的参数 -Werror去掉,也就是关闭Kotlin的-Weeror校验即可解决。
错误2:程序包jdk.jfr不存在
涉及jdk版本的地方都使用jdk11(jdk8里是没有这个包的)
错误3:找不到符号 变量 CoroutinesUtils
这时选择File->Project Structure->Libraries,点击加号选择Java找到spring core包下编译后的kotlin包,位置在spring-corekotlin-coroutinesbuildlibskotlin-coroutines-5.3.7-SNAPSHOT.jar,点击确定。选择应用到spring-core的模块即可。
运行成功
常见的错误解决后,我们运行main函数,应该就可以输入”hello spring!”了,到这里就大功告成啦,打完收工。接下啦我们就可以愉快的debug调试源码了。
原文始发于微信公众号(小新成长之路):spring框架源码阅读及调试环境的搭建
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/238599.html