Spring 源码在 IDEA 下调试环境搭建

Spring 源码在 IDEA 下调试环境搭建

 ​ 源码是这个世界上最廉价最无价的东西。廉价是因为每个人都可以获取,只要你有一台计算机,连上网,你就可以去下载它,对于程序员来说几乎零成本;无价是因为它的价值是需要人去挖掘的,不同的人从中获取到的价值是不同的,类似于师傅领进门,修行在个人。源码就是那么一位师傅,它充满哲学与艺术,它是设计模式的最佳集成者,阅读优秀的源码,就像在与大师,与艺术家进行面对面的交流,最重要的是这是不要钱的,你可以随时随地的交流,相对于专栏之类的而言。几年前我曾使用 Eclipse 调试过部分 Spring 源码,但是没有坚持下来,对此我非常懊悔,实在是太不应该了,庆幸的是我此番醒悟了,阅读源码是一个枯燥的过程,鲜少有人能够坚持下来,一旦你坚持下来了,那么你将获得巨大的收获。

 ​ 闲话少说,接下来我们进入正题,首先在搭建环境之前我们需要准备一些原料,它包含 jdkgradleSpring 源码IDEA

以下是本人使用的版本,并附上官网下载地址:

工具版本下载地址
jdk1.8.0_121https://www.oracle.com/technetwork/java/javase/downloads/index.html
gradle-4.6https://gradle.org/install/
aspectj-1.9.4https://www.eclipse.org/aspectj/downloads.php
IDEA 2019.1https://www.jetbrains.com/idea/?fromMenu
Spring-5.0.4.RELEASEhttps://spring.io/projects/spring-framework

1. Java 运行环境 JDK 安装与配置

 ​ 详细安装配置流程见笔者另一篇博客: https://blog.csdn.net/qq_21369769/article/details/97495845

2. GRADLE 安装与配置

 ​ 详细安装配置流程见笔者另一篇博客: https://blog.csdn.net/qq_21369769/article/details/97501216

3. AspectJ 安装

  进入 aspectj-1.9.4.jar 所在目录,执行以下命令:

	java -jar aspectj-1.9.4.jar

调出安装界面:如下图所示:

接下来一路next,最后install即可完成安装。

4. IDEA 安装

  双击下载的 ideaIU-2019.1.exe 安装包,弹出安装界面,一路next,最后等待安装完成即可。安装过程中做如下勾选即可:

5. Spring 源码下载

 ​ 可以使用 Git 下载或者直接 Download ZIP,如下图所示,二者随意选择其一都可以

 ​ 至此所有原料都准备好了,接下来开始准备搭建戏台子了。

6.Spring 源码导入 IDEA 步骤

  网上有许许多多 Spring 源码搭建博客,但是貌似很多都是相互转载,并且尚未亲身实践的,因此与真实环境存在很大出入,各种问题层出不穷,因此笔者准备亲自尝试搭建 IDEA 下的 Spring 源码调试环境,以下两种方式就是笔者亲自尝试后测验过的,现记录下详细步骤,希望能够对看到此文的你有所帮助。

方案一:

  • 6.1 打开 IDEACheck out from Version Control ,选择 Git
  • 6.2 在URL:中输入 https://github.com/spring-projects/spring-framework.git,点击 Clone

    此时项目正在拉取中,需要稍等一会儿
  • 6.3 项目拉取完毕后点击 Yes

    导入项目,对 Gradle 进行如下配置,自动导包,使用本地安装的 Gradle ,配置本地库
  • 6.4 开始 BuildBuild Project 项目,项目报如下错误,这是由于 spring-core 模块缺少 cglib 包和 objenesis 包导致的

    此时选择右边的 Gradle 构建,找到 spring-core,展开Tasks 下的 other,依次编译 cglibRepackJarobjenesisRepackJar

    6.5 继续 BuildBuild Project 项目,项目报如下错误,spring-aop 模块缺少 target 包,这是由于我们 IDEA 默认忽略掉了 target 导致的

    此时键入快捷键 ctrl + art + s,开始对 IDEA 进行配置,输入 file,找到 File Types,移除最下方的 target,然后 ApplyOk

    6.6 继续 BuildBuild Project 项目,项目报如下错误,spring-aspects 编译报错,这是因为我们使用的是Javac编译它并不支持 aspectj 相关的语义,最好的做法是将aspectj 项目添加 ajc编译,可以参考方案二中的做法,由于当前我们暂时未使用该模块,最快的做法是我们先直接将该模块移除

    右键项目,Load/Upload Modules,选中 spring-aspects,然后 UnloadOk,如下图所示:


    6.7 继续 BuildBuild Project 项目,项目报如下错误,这是由于 spring-oxm 缺少 jaxb 包导致的, 我们打开右边的 Gradle 构建,找到 spring-oxm,在 Tasks 下的 other 下找到 genJaxb ,进行编译即可。

    6.8 最后 BuildBuild Project 项目,至此 Spring 调试环境基本搭建完毕了,接下来我们来个小 demo 来 debug 一下我们的源码吧,冲吧,少年!

方案二:

  • 6.1 Download ZIP 源码,解压,进入根目录,执行以下命令构建 spring-oxm,
	gradlew :spring-oxm:compileTestJava

最后控制台输出如下信息,中间部分省略

E:\Code\Idea\spring-framework-5.0.4.RELEASE\spring-framework-5.0.4.RELEASE>gradlew :spring-oxm:compileTestJava
Starting a Gradle Daemon (subsequent builds will be faster)
Download https://plugins.gradle.org/m2/org/jetbrains/kotlin/jvm/org.jetbrains.kotlin.jvm.gradle.plugin/1.2.21/org.jetbrains.kotlin.jvm.gradle.plugin-1.2.21.pom
Download https://plugins.gradle.org/m2/org/jetbrains/dokka/org.jetbrains.dokka.gradle.plugin/0.9.15/org.jetbrains.dokka.gradle.plugin-0.9.15.pom
Download https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-gradle-plugin/1.2.21/kotlin-gradle-plugin-1.2.21.pom
Download https://jcenter.bintray.com/org/jetbrains/dokka/dokka-gradle-plugin/0.9.15/dokka-gradle-plugin-0.9.15.pom
Download https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-gradle-plugin-api/1.2.21/kotlin-gradle-plugin-api-1.2.21.pom
Download https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-annotation-processing-gradle/1.2.21/kotlin-annotation-processing-gradle-1.2.21.pom
......................................................................
> Task :spring-context:compileTestJava lease/javax/annotation/javax.annotation-api/1.3.1/javax.annotation-api-1.3.1.jar
注: 某些输入文件使用了未经检查或不安全的操作。
注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。

> Task :spring-oxm:genCastor
[ant:javac] : warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds

> Task :spring-oxm:genJaxb
[ant:javac] : warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds

> Task :spring-oxm:compileTestJava
注: 某些输入文件使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。


BUILD SUCCESSFUL in 3m 22s
51 actionable tasks: 51 executed
  • 6.2 通过 IDEA 导入 Gradle 项目

  • 6.3 对 Gradle 进行配置,与方案一中配置相同,并未有任何需要变动的地方
  • 6.4 项目导入后报如下问题,点击 Open File ,将 compileGroovy.dependsOn = compileGroovy.taskDependencies.values - ‘compileJava’ 注释掉即可

  • 6.5 重新 BuildBuild Project ,报如下错误,IDEA 默认使用 Javac 编译,不能识别 aspectj 语义

    对此我们进行以下配置用来支持 aspectj ,如果你想在不包含 aspectj 的模块使用 Javac 编译,那么勾上 Delegate to Javac,之后 Apply, Ok,最后我们还需做一步就是将使用到 aspectj 的模块加入到 aspectj。如果不想使用,也可
    以暂时不用,类似于方案一中直接将 spring-aspects 模块直接移除。

  • 6.6 最后 BuildBuild Project ,自此 Spring 源码调试环境构建完成。

7.搭建 Demo 测试 Spring 环境

7.1 Demo 构建步骤

  • 首先我们在 spring 同结构下构建一个 maven 项目,右键 Spring 项目,new Module,选择 maven ,之后填写 gav (group,artifactId,version)坐标 ,如图所示:
  • 先创建一个简单的 Bean (POJO),如下,创建 User.java
package top.domgao.bean;

/**
 * @author dockerxjbckr
 * @create 2019-07-26 20:56
 */
public class User {

	private String username = "domgao";
	private Integer age;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}
}
  • 然后创建一个 Spring 配置文件,我这里取名为 applicationContext.xml,如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="user" class="top.domgao.bean.User"></bean>
</beans>
  • 最后我们编写一个测试类 TestBean.java 来对源码进行调试,如下:
package top.domgao;

import org.springframework.context.support.ClassPathXmlApplicationContext;
import top.domgao.bean.User;

/**
 * @author dockerxjbckr
 * @create 2019-07-25 22:02
 */
public class TestBean {

	public static void main(String[] args) {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		User bean = (User) ctx.getBean("user");
		System.err.println("domgao".equals(bean.getUsername()));
	}

}

  • 至此我们的程序就编写完成了,我们将为项目加上以下依赖,选中我们的 maven 项目,F4 快捷键,为项目添加上以下内联依赖,然后进行 debug 模式调试项目,如下所示:
  • 以下是我 debug 中控制台输入的结果,调试的过程就不在此贴出了,最后,你学会了吗?加油,不要放弃治疗,虽然阅读源码很枯燥,但是要坚持哦。最后推荐一本 Spring 源码相关的好书,《Spring 源码深度解析》(第二版),作者 郝佳,笔者买了一本收藏起来了,还从网上找了一本电子版的,没事就读读,相信你会有很大的收获的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值