IDEA 导入 spring 源码

这篇具有很好参考价值的文章主要介绍了IDEA 导入 spring 源码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

我们在学习 spring 源码的时候,有时候是需要在阅读源码的时候添加一些代码注释,或者是对源码的一些感悟,如果没有将 spring 的源码导入到 IDEA 中,单纯是通过 Maven 去阅读 jar 的形式是无法添加一些注释信息的,即便可以通过一些比如像 Private Notes 这样的插件做到在源代码中添加注释,但还是有局限性的,首先这个插件不允许你更改源码的行数,所以你的私人注释只能写在一行里,其次导入源代码,你可以更改源代码比如说打印一些东西,都是更有助于去理解源码的。

以下内容是我第一次使用 IDEA 去导入 Spring 源码的一个过程,踩了很多坑,我也记录下我所遇见的问题,以及解决的方案,希望对你有所帮助。


spring 官网:https://spring.io/

一、下载源码

我们可以在 github 或者 gitee 上都能下载到 spring 的源码

github 上下载:

github 上搜索 spring-fremawork 就能找到:https://github.com/spring-projects/spring-framework

IDEA 导入 spring 源码

gitee 上下载:

gitee 上搜索 spring-fremawork 就能找到:https://gitee.com/mirrors/spring-framework?_from=gitee_search

IDEA 导入 spring 源码

虽然说使用可以 git clone 下载源码,但是不太推荐(本人亲自踩过坑,好多问题),这里最好还是直接下载 ZIP 压缩包

我在电脑上创建了 /source-code 这样一个文件夹用于管理我的源代码,然后将下载好的源代码解压缩到该文件夹下,这里我学习的版本是 spring-framework-5.2.x

IDEA 导入 spring 源码


二、安装 Gradle


1. 下载 Gradle

Gradle 是一个构建工具,它类似于 Meven,Spring 就是用 Gradle 进行编译的,所以我们还是下载个 Gradle 会比较好。
IDEA 导入 spring 源码

下载 Gradle 我们一定要找到跟你下载的 Spring 源码兼容的版本,在你下载好的源码中的 \spring-framework-5.2.x\gradle\wrapper\gradle-wrapper.properties 文件中可以查找到应该下载哪个版本的 Gradle

IDEA 导入 spring 源码

所以按照 gradle-wrapper.properties 文件的指定我应该下载 gradle-5.6.4-bin.zip 这个版本的 Gradle

去到官网上下载 https://services.gradle.org/distributions/

IDEA 导入 spring 源码

我创建了一个 /gradle 的文件夹存放刚刚下载好的 Gradle,再进行解压

Gradle 和 Meven 一样都有个仓库,这里为了方便,我把 Gradle 的仓库 .gradle 也创建在这个目录下了

IDEA 导入 spring 源码


2. 配置环境变量

鼠标右键 我的电脑(此电脑) - 属性 - 高级系统设置 再选择 环境变量

IDEA 导入 spring 源码

点击 环境变量 进来大概是这样子的,点击 新建

IDEA 导入 spring 源码

如下图所示进行配置,配置完成后,点击确定保存配置

配置 GRADLE_HOME

变量名:GRADLE_HOME
变量值:D:\gradle\gradle-5.6.4-bin\gradle-5.6.4(Gradle 的安装目录,也就是 bin 文件夹所在的目录)

IDEA 导入 spring 源码

配置 GRADLE_USER_HOME

变量名:GRADLE_USER_HOME
变量值:D:\gradle\.gradle(Gradle 仓库目录)

IDEA 导入 spring 源码

同时还需要添加 Path 的 配置,选择 Path ,点击 编辑

IDEA 导入 spring 源码

新建环境变量:

  • %GRADLE_HOME%\bin
  • %GRADLE_USER_HOME%

IDEA 导入 spring 源码

确定 保存

现在 cmd 打开命令窗口,输入 gradle -v 命令检测 Gradle 是否安装成功

IDEA 导入 spring 源码

能够看到 版本信息 就 ok 了


三、导入前准备

为了加速 gradle 下载依赖包的速度,我们需要在 build.gradlesettings.gradle 这两个文件中添加国内的镜像地址。

IDEA 导入 spring 源码

build.gradle 文件

IDEA 导入 spring 源码

maven { url "https://maven.aliyun.com/nexus/content/groups/public/"}
maven { url "https://maven.aliyun.com/nexus/content/repositories/jcenter"}
maven { url "https://repo.springsource.org/plugins-release"}

settings.gradle 文件

IDEA 导入 spring 源码

maven{ url "https://maven.aliyun.com/nexus/content/groups/public/"}

spring-framework\gradle\wrapper\gradle-wrapper.properties 文件中的 distributionUrl 修改成自己下载的 (PS:这一步可做可不做

IDEA 导入 spring 源码

distributionUrl=file\:///D\:/gradle/gradle-5.6.4-bin.zip

四、编译源码


1. 导入源码

打开 IDEA ,选择 File -> Open

IDEA 导入 spring 源码

选中 spring 源码所在目录

IDEA 导入 spring 源码

导入进来是这样子的

IDEA 导入 spring 源码

项目导进来之后先检查下 JDK 的配置,因为 Gradle JVM 是需要使用 JDK 11,所以务必配置 JDK 11,可以避免很多坑

IDEA 导入 spring 源码

IDEA 导入 spring 源码

然后再配置 Gradle

IDEA 导入 spring 源码

检查下 git 配置(编译的时候会自动去检测 git,所以需要检查下)

IDEA 导入 spring 源码

接下来就等项目自动构建,因为这个过程 Gradle 会下载一些 jar 包需要一些时间。

IDEA 导入 spring 源码

当你看到每一个项目 右下角 基本上都带着一个 蓝色方块,就表示 Spring 的源码导入成功了。

如果你在上述过程中遇到问题,不妨往下面看看 ~~


2. 我所遇见的问题

  1. fatal: not a git repository (or any of the parent directories): .git

IDEA 导入 spring 源码

解决这个问题很简单,进到这层目录下, 调起 Git Bash Here ,依次执行以下三行命令

git init
git add .
git commit -m "随便写点啥都行"

IDEA 导入 spring 源码

在去 IDEA 中重新构建一下就好了

  1. Gradle 版本导致 A problem occurred evaluating root project 'spring'. 等问题

IDEA 导入 spring 源码

之前我是按照 gradle.properties 这个文件下载的 gradle-5.3-bin.zip,我以为够了,没想到 java-test-fixtures 这些包下载不到,没办法,我只能根据 gradle-wrapper.properties 再下载一个 gradle-5.6.4-bin.zip 的版本

IDEA 导入 spring 源码

重新设置一下 IDEA 的 GreadleSpecified location,选择刚下的 Gradle gradle-5.6.4-bin.zip 的版本

IDEA 导入 spring 源码

所以还是要以 gradle-wrapper.properties 文件指定的 Gradle 版本为准会避免掉一些坑

  1. POM relocation to an other version number is not fully supported in Gradle : xml-apis:xml-apis:2.0.2 relocated to xml-apis:xml-apis:1.0.b2

IDEA 导入 spring 源码

我重新构建下就好了,所以也没啥好说的


五、测试


1. 创建 module

现在源码是顺利的导入进来了,那就在 spring 的项目中新建一个 module 来测试一下

右键项目根目录,New -> Module 创建一个 module

IDEA 导入 spring 源码

这个要选 Gradle,点击 Next

IDEA 导入 spring 源码

设置模块名,点击 Finish

IDEA 导入 spring 源码

就 ok 了

IDEA 导入 spring 源码


2. 编写测试代码

IDEA 导入 spring 源码

替换成

IDEA 导入 spring 源码

    testImplementation group: 'junit', name: 'junit', version: '4.13.1'
    testImplementation group: 'org.hamcrest', name: 'hamcrest-core', version: '1.3'
    compile(project(":spring-context"))

这里简单说明以下,Gradle 如果引用的是本项目中的模块,则使用 compile(project(":moduleName)),如果使用的是第三方的包,则使用 testImplementation group:xxxx ' 导入

测试结果:

可以看到是没什么问题的,没有报错,并且使用的类是本项目的,能够正确执行

IDEA 导入 spring 源码

测试代码如下:

UserController.calss

package com.mike.controller;

import com.mike.service.UserService;

public class UserController {

	private UserService userService;

	/**
	 * DI:set 方法注入
	 */
	public void setUserService(UserService userService) {
		this.userService = userService;
	}

	public String findAll() {
		return userService.findAll();
	}
}

UserService.java

package com.mike.service;

public interface UserService {

	String findAll();

}

UserServiceImpl.java

package com.mike.service.impl;

import com.mike.service.UserService;

public class UserServiceImpl implements UserService {

	@Override
	public String findAll() {
		return "返回所有用户信息";
	}

}

MainTest.java

package com.mike.test;

import com.mike.controller.UserController;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainTest {

	@Test
	public void test() {
		// 获取 Spring 容器对象
		// 执行这行代码相当于启动了 Spring 容器,解析 spring.xml 文件,并且实例化所有的 bean 对象放到 spring 容器中
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring.xml");
		// 获取 UserController 对象
		UserController userController = applicationContext.getBean("userController", UserController.class);
		// 执行方法
		String allUsers = userController.findAll();
		System.out.println("allUsers = " + allUsers);
	}
}

spring.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">


	<!-- 使用 Spring IOC 和 ID 管理对象 -->
	<bean id="userService" class="com.mike.service.impl.UserServiceImpl"/>

	<bean id="userController" class="com.mike.controller.UserController">
		<property name="userService" ref="userService"/>
	</bean>

</beans>

如果你在上述过程中遇到问题,不妨往下面看看 ~~


3. 我所遇到的问题

  1. build.gradle 怎么配置第三方依赖

比如我写的测试模板中需要 junit,在 pom 文件中我们可以这样导入

        <!-- junit 单元测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <scope>test</scope>
        </dependency>

但是在 build.gradle 文件中我们该怎么去写呢?

其实在 Maven 仓库 中就提供了 Gradle 的导入方式,直接复制过来就行了

IDEA 导入 spring 源码

  1. Kotlin: warnings found and -Weeror specified

在我写完测试代码之后运行 MainTest 类中的 test() 方法所报

IDEA 导入 spring 源码

这个问题出现的原因是 缺少 cglib 和 objenesis 包

解决:在这个目录下调起命令行窗口

IDEA 导入 spring 源码

输入以下两个指令:

gradle objenesisRepackJar
gradle cglibRepackJar

IDEA 导入 spring 源码

  1. java: 找不到符 符号:变量 CoroutinesUtils

解决上一个问题之后再运行 MainTest 类中的 test() 方法所报,这个问题可以说经常会遇到,每构建一次项目都有可能出现

IDEA 导入 spring 源码

这是因为 CoroutinesUtilskotlin 的一个工具类,Spring 源码包读取不到,所以需要手动添加 kotlin-coroutines-X.X.X.BUILD-SNAPSHOT.jarLibraries 中。

点击 File -> Project Structure -> Libraries -> + -> Java

IDEA 导入 spring 源码

然后选择 spring-framework/spring-core/kotlin-coroutines/build/libs/kotlin-coroutines-X.X.X.BUILD-SNAPSHOT.jar 点击 OK (如果你的 kotlin-coroutines 目录下没有 build 目录,跳转到问题3)

IDEA 导入 spring 源码

然后就会跳出一个选择 modules 的页面,选中 spring.spring-core.main 点击 OK

IDEA 导入 spring 源码

  1. kotlin-coroutines 目录下没有 build 目录

如果你和我一样并没有发现

IDEA 导入 spring 源码

点击右侧的 Gradle -> Tasks -> other -> complieKotlin

IDEA 导入 spring 源码

编译之后就有了

  1. compileXXXX 时或者在运行时报错 PropertyComparator<capture#1, 共 ?>无法转换为java.util.Comparator<? super capture#1, 共 ?> 等各种泛型使用问题

比如 compileKontlin 时

D:\source-code\spring-framework-5.2.x\spring-framework-5.2.x\spring-beans\src\main\java\org\springframework\beans\support\PropertyComparator.java:138: ����: �����ݵ�����: PropertyComparator<CAP#1>�޷�ת��ΪComparator<? super CAP#1>
			source.sort(new PropertyComparator<>(sortDefinition));
			            ^
  ����, CAP#1�������ͱ���:
    CAP#1��?�IJ�����չObject

IDEA 导入 spring 源码

或者是运行 main 方法、Test 方法 时

D:\source-code\spring-framework-5.2.x\spring-framework-5.2.x\spring-beans\src\main\java\org\springframework\beans\support\PropertyComparator.java:138:25
java: 不兼容的类型: org.springframework.beans.support.PropertyComparator<capture#1,?>无法转换为java.util.Comparator<? super capture#1,?>

IDEA 导入 spring 源码

这个问题感觉是跟泛型有关的坑,我就改了下源码

IDEA 导入 spring 源码

再编译之后这个问题就没有再出现了,不过又出现新的问题

D:\source-code\spring-framework-5.2.x\spring-framework-5.2.x\spring-messaging\src\main\java\org\springframework\messaging\handler\annotation\reactive\PayloadMethodArgumentResolver.java:236: ����: �����ݵ�����: lambda ���ʽ�еķ������ʹ���
							.onErrorResume(ex -> Flux.error(handleReadError(parameter, message, ex)));
							                               ^
    Flux<CAP#1>�޷�ת��ΪPublisher<? extends CAP#1>
  ����, CAP#1�������ͱ���:
    CAP#1��?�IJ�����չObject

IDEA 导入 spring 源码

也跟泛型有关,所以修改这边的代码不是个很好的解决办法,改了一个后续还会遇见很多个,治标不治本

这个问题出现的原因是 gradle jvm 的版本没有使用 jdk 11导致的,所以 Gradle JVM 务必换成 JDK 11

IDEA 导入 spring 源码

Project 的 JDK 也改成 11

IDEA 导入 spring 源码

再编译就没问题了

IDEA 导入 spring 源码


六、总结

以上就是我使用 IDEA 导入 Spring 源码的全过程,不得不说 IDEA 导入 Spring 源码真的有好多的坑啊,不知道多少学习源码的人在这里就被劝退了 ~~

其中还有些错误我没有列举出来,因为这是我优化过后总结出来的,所以另外些错误我没有再遇到过就不写在这上面了,在这个过程中觉得最大的阻碍就是对 Gradle 的不熟悉,很多问题都跟 Gradle 有关,好在最后都解决了,也希望这篇文章能够让你在学习源码的过程中有个好的开头。


参考博客:
《Spring》第一篇 IDEA导入Spring源码:https://blog.csdn.net/weixin_44167408/article/details/121769949
知乎:spring源码编译的过程和问题:https://zhuanlan.zhihu.com/p/378831634文章来源地址https://www.toymoban.com/news/detail-442016.html

到了这里,关于IDEA 导入 spring 源码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【教程】IDEA配置Tomcat以及如何导入导出包含java源码的war包

    今天第一次写web课的上机实验项目,实验说明给的全是eclipse的操作流程,导致本菜鸡以及班上许许多多使用IDEA甚至spring项目闭眼都能写的大牛无从下手(因为springboot集成了Tomcat)。经过本人今日六个小时在某度搜索站的热血奋战,尚且总结了一套教程用以答疑解惑。 idea不

    2024年02月10日
    浏览(52)
  • IDEA编译Spring源码教程

    大家在学习spring时源码总是绕不开的,今天我分享一下我的spring源码编译过程,详细讲解了常见问题的解决办法。 此过程中要用到的工具及版本: 1.JDK11 2.Spring-framework 5.3.27 3.Gradle7.5.1 4.IDEA 2021.3 文章目录: 1.下载spring源码 2.阅读spring官方编译文档 3.修改gradle相关配置 4 .开始

    2023年04月20日
    浏览(33)
  • IDEA报错:前言中不允许有内容

    idea启动项目提示前言中不允许有内容 解决方法: 首先修改设置:IDEA–File–Settings–File Encodings–with No BOM 选中报错文件右键移除Bom 如果遇到java: 程序包org.springframework.boot不存在的问题参考:【完美解决】java: 程序包org.springframework.boot不存在的解决方法_猿月亮的博客-CSDN博客

    2024年02月07日
    浏览(38)
  • Sentinel如何实现对分布式系统的高可用性和流量控制?我们通过源码一起学习

    前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将详细介绍Sentinel源码实现对分布式系统高可用性和流量控制,后续文章将详细介绍Sentinel的其他知识。 如果文章有什么需要改进的地方还请大佬不吝赐教 👏👏。 小威在此先感谢各位大佬啦~~🤞🤞

    2024年02月06日
    浏览(45)
  • 从零开始学Spring Boot系列-前言

    在数字化和信息化的时代,Java作为一种成熟、稳定且广泛应用的编程语言,已经成为构建企业级应用的首选。而在Java生态系统中,Spring框架无疑是其中最为耀眼的一颗明星。它提供了全面的编程和配置模型,用于构建企业级应用。随着Spring Boot的出现,这一框架变得更加易于

    2024年02月22日
    浏览(59)
  • 【MyBatis学习】Spring Boot(SSM)单元测试,不用打包就可以测试我们的项目了,判断程序是否满足需求变得如此简单 ? ? ?

    前言: 大家好,我是 良辰丫 ,在上一篇文章中我们学习了MyBatis简单的查询操作,今天来介绍一下 Spring Boot(SSM)的一种单元测试 ,有人可能会感到疑惑,框架里面还有这玩意?什么东东呀,框架里面是没有这的,但是我们简单的学习一下单元测试,可以帮助我们自己测试代码,学习单元测试

    2024年02月09日
    浏览(91)
  • IDEA+spring boot+mybatis+spring mvc+bootstrap+Mysql停车位管理系统源码

    随着时代和科技的进步,人们的生活水平越来越高,私家车的数量不断上涨,随之产生了一些问题,其中就包括停车难,很多地方人们根本找不到停车位,经常有司机为了找停车位转来转去,走了很多弯路,更重要的是浪费了大量的时间。 而停车场车位管理系统可以使司机清

    2024年02月12日
    浏览(44)
  • IDEA+Spring Boot + MyBatis + Layui+Mysql垃圾回收管理系统源码

    本系统实现了垃圾回收管理系统,管理端实现了管理员登录、垃圾回收管理、添加需要回收的垃圾、垃圾去向管理、申请需要打包运出的垃圾、系统公告管理、个人信息管理、修改密码 JDK版本:1.8 Mysql:5.7 账号:好贵啊 密码:123456 点击以下链接获取源码。 IDEA+Spring Boot + MyBati

    2024年02月13日
    浏览(46)
  • 【C++】C++学习前言

    C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(objectoriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。

    2024年03月12日
    浏览(56)
  • 课程学习前言

    app 抓包分析可以看到有签名有加固,毕竟需要 APK 去访问服务、获取数据,都需要 APK 有完整的信息,而这些信息、代码经过各种加密,还是放在 APK 里面。说白了,就是门锁紧了,钥匙藏在门口某个地方,也许就是地垫下面 逆向流程 拿到 App 应用的 apk ; 使用工具进行查壳

    2024年02月06日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包