基于IDEA的Spring源码调试
文章目录
- 一、获取代码
- 二、关于我们使用的IDEA
- 三、关于使用的Gradle
- 四、关于我们使用的JDK
- 五、关于使用的Kotlin
- 六、Spring源码的导入
- 七、自己模块的创建
- 1、我们需要注意的点(踩的坑)
- 1.1、在checkstyleMain阶段无法通过编译
- 1.2、出现包没有的情况,AbstractApplicationContext找不到包
- 1.3、在构建时告诉我们缺少xml文件
一、获取代码
我们从git上拉最新的代码,这里我们要注意一下,一定要拉最新的代码,老代码会有个问题,包是拉不下来的,会有权限问题,Spring内部开发人员已经摒弃了release仓库,类似这种报错。
Could not GET 'https://repo.spring.io/plugins-release/io/spring/gradle/propdeps-plugin/0.0.8-SNAPSHOT/maven-metadata.xml'. Received status code 401 from server: Unauthorized
Disable Gradle 'offline mode' and sync project
后面我又试了各种各样的源,淘宝源、Maven库之类的,都会有差包的问题,所以建议拉最新的就行了。
我们可以在这篇文章中得到一些回答。
https://spring.io/blog/2020/10/29/notice-of-permissions-changes-to-repo-spring-io-fall-and-winter-2020
这里我拉取的是v6.0.0-M3
这个版本,加-b XXX
可以选择版本。
git clone https://github.com/spring-projects/spring-framework
Tips:为啥叫spring-framework?
This is the home of the Spring Framework: the foundation for all Spring projects. Collectively the Spring Framework and the family of Spring projects are often referred to simply as “Spring”.
二、关于我们使用的IDEA
对于最新的Spring源码,我们相对应的需要使用2021.1
以上版本的IDEA,不然在编译的时候会有些问题。
三、关于使用的Gradle
Gradle使用7.0
以上的版本就足够了,我用的是7.4.2
,我们去官网下载一下,下个完整版的。
https://gradle.org/next-steps/?version=7.4.2&format=all
后续解压,如果需要本地执行命令,在Path里面配置一下就行了,这就不累述了,不是重点。
在idea中的选择如下图所示:
- user home:表示gradle的目录,也就是包,执行脚本等等放置的位置,默认在C盘的User下面,我建议换个位置,节省C盘的空间。
- Build and run:可以使用gradle,也可以使用idea自己本身,具体差别不大,不影响我们的操作。
- Use Gradle from:默认使用的是idea自己的gradle,我们可以让他自己下载,但是我选择的是自己配置。
- Gradle JVM:Gradle使用的JVM。
四、关于我们使用的JDK
JDK需要使用17
以上的版本,我使用的是17.0.2
,在Gradle JVM那里选择一下就行了。
给个下载地址:https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.zip
五、关于使用的Kotlin
因为Spring源码最新使用的Gradle使用的是Kotlin语言来写的,所以我们需要装一下Kotlin插件。我使用的是1.6.20
版本。
在Settings->Plugins搜索安装一下即可。
六、Spring源码的导入
我们只需要open项目文件夹,IDEA会根据配置文件自动对项目build,如果你发现一些test无法通过并且不想等那么久,我们可以点击在gradle模块的那个大象的图标,自己输入命令gradle build -x test
越过测试阶段。
七、自己模块的创建
我这里提供一个简单的测试模块
- HelloWorld.java
/** Copyright 2002-2021 the original author or authors.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** https://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package com.spring.bean;public class HelloWorld {private String user;public HelloWorld() {System.out.println("HelloWorld's constructor...");}public void setUser(String user) {System.out.println("setUser:" + user);this.user = user;}public HelloWorld(String user) {this.user = user;}public void hello(){System.out.println("Hello: " + this.user);}}
- Application.java
/** Copyright 2002-2021 the original author or authors.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** https://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package com.spring.application;import com.spring.bean.HelloWorld;import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;final class Application {private Application(){}public static void main(String[] args) {//1. 创建 Spring 的 IOC 容器AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");//2. 从 IOC 容器中获取 bean 的实例HelloWorld helloWorld = ctx.getBean(HelloWorld.class);// 根据类型来获取 bean 的实例: 要求在 IOC 容器中只有一个与之类型匹配的 bean, 若有多个则会抛出异常.// 一般情况下, 该方法可用, 因为一般情况下, 在一个 IOC 容器中一个类型对应的 bean 也只有一个.// HelloWorld helloWorld1 = ctx.getBean(HelloWorld.class);//3. 使用 beanhelloWorld.hello();}
}
- 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 https://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 配置一个 bean --><bean id="helloWorld" class="com.spring.bean.HelloWorld"><!-- 为属性赋值 --><property name="user" value="Jerry"></property></bean>
</beans>
- spring-debug.gradle
description = "Spring Debug"apply plugin: "kotlin"dependencies {api(project(":spring-context"))
}
1、我们需要注意的点(踩的坑)
1.1、在checkstyleMain阶段无法通过编译
Execution failed for task ':spring-debug:checkstyleMain'.
> Checkstyle rule violations were found. See the report at: file:///D:/study/spring6.0M3/spring-framework/spring-debug/build/reports/checkstyle/main.htmlCheckstyle files with violations: 1Checkstyle violations by severity: [error:5]* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
出现这个错,一般是我们没有按照Spring自己的代码规范进行编码,根据他给的网址file:///D:/study/spring6.0M3/spring-framework/spring-debug/build/reports/checkstyle/main.html
,查看对应的行的错误修改就行了,本身也是中文提示,一般都是什么开头没注释、空格只能用tab之类的问题。
1.2、出现包没有的情况,AbstractApplicationContext找不到包
第一步、我们要把spring-context引入我们的模块
api(project(":spring-context"))
第二步、我们要改一下gradle文件的名字
因为在Spring源码中默认是去找项目名称.gradle
这个文件,我们创建的模块默认叫build.gradle
。
具体是setting.gradle里面的配置导致的
rootProject.children.each {project ->project.buildFileName = "${project.name}.gradle"
}
第三步、构建项目
改下名字然后重新构建整个项目,也就是点一下那个刷新的图表。
1.3、在构建时告诉我们缺少xml文件
我们可以ctrl + alt + shift + s
把我们自己的xml加一下就行了。
基于IDEA的Spring源码调试相关推荐
- 在Eclipse中进行HotSpot的源码调试--转
原文地址:http://www.linuxidc.com/Linux/2015-05/117250.htm 在阅读OpenJDK源码的过程中,经常需要运行.调试程序来帮助理解.我们现在已经可以编译出一 ...
- idea调试源代码c语言,IDEA阅读spring源码并调试
目标:搭建起Spring源码阅读和代码调试跟踪的环境,顺便建立一个简单的Demo,能够调试Spring的源代码 本节,主要介绍一下Spring源码阅读和调试的相关环境搭建,并使用MVN创建一个非常简单 ...
- Spring源码深度解析(郝佳)-学习-源码解析-基于注解切面解析(一)
我们知道,使用面积对象编程(OOP) 有一些弊端,当需要为多个不具有继承关系的对象引入同一个公共的行为时,例如日志,安全检测等,我们只有在每个对象引用公共的行为,这样程序中能产生大量的重复代码,程序就 ...
- java毕业设计基于VUE电脑城摊位出租系统mybatis+源码+调试部署+系统+数据库+lw
java毕业设计基于VUE电脑城摊位出租系统mybatis+源码+调试部署+系统+数据库+lw java毕业设计基于VUE电脑城摊位出租系统mybatis+源码+调试部署+系统+数据库+lw 本源码技 ...
- 调试Spring源码 5.2.2.RELEASE
文章目录 1. 环境准备 2. Spring 环境配置 3. 调试源码 1. 环境准备 spring-framework 5.2.2.RELEASE:https://github.com/spring ...
- java毕业设计基于的校园头条新闻管理系统的设计与实现mybatis+源码+调试部署+系统+数据库+lw
java毕业设计基于的校园头条新闻管理系统的设计与实现mybatis+源码+调试部署+系统+数据库+lw java毕业设计基于的校园头条新闻管理系统的设计与实现mybatis+源码+调试部署+系统+数 ...
- java毕业设计基于Web的人事管理系统的设计与实现mybatis+源码+调试部署+系统+数据库+lw
java毕业设计基于Web的人事管理系统的设计与实现mybatis+源码+调试部署+系统+数据库+lw java毕业设计基于Web的人事管理系统的设计与实现mybatis+源码+调试部署+系统+数据库 ...
- java毕业设计基于VUE的个人记账管理系统mybatis+源码+调试部署+系统+数据库+lw
java毕业设计基于VUE的个人记账管理系统mybatis+源码+调试部署+系统+数据库+lw java毕业设计基于VUE的个人记账管理系统mybatis+源码+调试部署+系统+数据库+lw 本源码技 ...
- java毕业设计基于SpingBoot的剧本杀管理系统mybatis+源码+调试部署+系统+数据库+lw
java毕业设计基于SpingBoot的剧本杀管理系统mybatis+源码+调试部署+系统+数据库+lw java毕业设计基于SpingBoot的剧本杀管理系统mybatis+源码+调试部署+系统+数 ...
- java毕业设计基于JS的租房网站mybatis+源码+调试部署+系统+数据库+lw
java毕业设计基于JS的租房网站mybatis+源码+调试部署+系统+数据库+lw java毕业设计基于JS的租房网站mybatis+源码+调试部署+系统+数据库+lw 本源码技术栈: 项目架构:B ...
最新文章
- java bufferedwrite_Java BufferedWriter BufferedReader 源码分析
- 澳大利亚研究者研制出一种计算机芯片 他们,快讯:几乎看不见的3D打印机器人;西澳大利亚大学的研究人员开发出一种保护生态机器鱼;效率达CPU一万倍的神经形态芯片发布!...
- QT的QDomElement类的使用
- Cacti监控一台Webserver上多个Tomcatport的实现
- 解决 springboot 项目:找不到或无法加载主类
- Oracle 10.2.0.1.0升级到 10.2.0.4.0
- java excel条件格式_Java 使用条件格式高亮Excel单元格
- Union/find--不相交集类(并查集)
- Linux 命令(94)—— env 命令
- 计算机控制直流电机闭环调速实验报告,电气工程及其自动化电力系统实训报告-基于PLC的直流电机调速实验.pdf...
- [转载]从菜鸟到架构师
- 嵌入式linux环境搭建
- Microsoft Visual Studio 2012 产品密匙
- MATLAB安装后出现问题:MTALAB2021安装后闪退打不开
- H264 无损压缩及编解码流程
- html 设置图片显示比例,css巧妙设置等比例图片显示
- wgt 增量包下载过程中断,重新下载安装显示 [-1202]manifist 文件不存在
- 利用正则表达式处理内容数据(Python数据清洗)
- python如何使用最简单的方式将PDF转换成Word?
- 网络广告购买方式,RTB, DSP, AdExchange扫盲知识点汇总
热门文章
- easyui关于validatebox实现多重规则验证的实践
- android 入门-git之上传本地代码到github
- 在IDEA中编辑struts国际化properties文件
- 数字信号处理matlab——FIR浅析1
- 关闭Windows自动更新—大法
- mysql php教程笔记_Mysql学习笔记(一)
- python 视频转图片和图片转视频
- 强制打开BIOS中禁用的I/OAT DCA(二)
- python消息中间件activemq_python 发送和接收ActiveMQ消息的实例
- android.jar 重新编译,android的framework.jar反编译,并重新编译