修改和编译spring源码,构建jar(spring-context-4.0.2.RELEASE)
上周在定位问题时,发现Spring容器实例化Bean的时候抛出异常,为了查看更详细的信息,决定修改spring-context-4.0.2.RELEASE.jar中的CommonAnnotationBeanPostProcessor类的代码,在里面打印出更详细的信息,以便我们分析和定位问题,下面我们一步一步通过实战来修改和编译spring-context的源码;
下载源码
下载源码的第一步,是找个用到了spring-context-4.0.2.RELEASE.jar的java工程,如果读者您手里没有现成的工程,可以在我的git上下载,地址:https://github.com/zq2599/blog_demos
下载后可以发现里面有很多工程,本次实战用的工程是springmybatisexceptiondemo,如下图红框所示:

用命令行进入pom.xml所在的目录下,执行命令mvn dependency:sources,即可下载所有依赖库的源码包,如下图:

此时进入maven的本地仓库,找到spring-context的目录,在里面就能看到源码的jar包,如下图:

maven的本地仓库,一般在用户目录的.m2文件夹下;
解压jar包,准备材料
在maven的本地仓库中,找到spring-context的目录后,将里面的spring-context-4.0.2.RELEASE.pom,spring-context-4.0.2.RELEASE-sources.jar,spring-context-4.0.2.RELEASE.jar这三个文件都复制到一个新建的文件夹中,然后将spring-context-4.0.2.RELEASE-sources.jar和spring-context-4.0.2.RELEASE.jar都解压;
新建spring-context的maven工程
新建一个maven工程,pom文件的内容和spring-context-4.0.2.RELEASE.pom的一模一样,如下图:

进入刚才解压的spring-context-4.0.2.RELEASE-sources.jar的文件夹,把里面的org文件夹整个都复制到新建的maven工程的java文件夹下,如下图所示:

只复制java文件是不够的,还要复制META-INF和xsd文件,这些东西都不在spring-context-4.0.2.RELEASE-sources.jar包中,还记得刚刚我们把spring-context-4.0.2.RELEASE.jar文件也解压了么?META-INF和xsd文件在这个解压的文件夹中可以找到;
先是META-INF,在spring-context-4.0.2.RELEASE.jar的解压目录中,把META-INF文件夹复制到新建的maven工程的resources文件夹下,如下图所示:

接下来是xsd文件,在spring-context-4.0.2.RELEASE.jar的解压目录中,进入org/springframework/cache/config子目录,里面不以class为后缀的文件有四个,把这四个文件全部复制到maven工程源码的org/springframework/cache/config目录下,如下图:

以下几个目录下也有xsd文件,请像上面的方法一样,将里面的xsd和gif都复制到maven工程中对应的目录下:
org/springframework/context/config
org/springframework/ejb/config
org/springframework/scheduling/config
org/springframework/scripting/config
构建jar包
在上面所建的maven工程的pom.xml文件所在目录下,执行命令mvn clean package -U -Dmaven.test.skip=true,执行成功后,在target目录下就能看到最新构建的jar包了,如下图:

至此,我们实践了构建spring-context的jar包的过程,根据实际需要,我们可以先修改了源码再构建,例如下图是我修改的CommonAnnotationBeanPostProcessor类的源码,很简单,加了一些输出,比如打印当前缓存的key,以及代码的调用栈情况:

改完代码后重新构建,生成新的spring-context-4.0.2.RELEASE.jar文件,我的web应用之前已经部署在了tomcat下,现在打开这个应用的lib目录,用这个jar替换原有的文件,再重启tomcat,在控制台可以看到打印出了比以前更多的异常堆栈内容,便于我们定位问题:

欢迎关注我的公众号:程序员欣宸
修改和编译spring源码,构建jar(spring-context-4.0.2.RELEASE)的更多相关文章
- Spring源码-IOC部分-Spring是如何解决Bean循环依赖的【6】
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...
- Spring源码-AOP部分-Spring是如何对bean实现AOP代理的
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 历史文章 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] S ...
- Spring源码构建
1.下载spring源码并解压 https://codeload.github.com/spring-projects/spring-framework/zip/v5.0.2.RELEASE 打开bu ...
- spring源码深度解析—Spring的整体架构和环境搭建
概述 Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.Spring是于2003 年兴起的一个轻量级的Java 开发框 ...
- 框架源码系列六:Spring源码学习之Spring IOC源码学习
Spring 源码学习过程: 一.搞明白IOC能做什么,是怎么做的 1. 搞明白IOC能做什么? IOC是用为用户创建.管理实例对象的.用户需要实例对象时只需要向IOC容器获取就行了,不用自己去创建 ...
- Spring源码分析(一):从哪里开始看spring源码(系列文章基于Spring5.0)
概述 对于大多数第一次看spring源码的人来说,都会感觉不知从哪开始看起,因为spring项目源码由多个子项目组成,如spring-beans,spring-context,spring-core, ...
- spring源码学习(三)--spring循环引用源码学习
在spring中,是支持单实例bean的循环引用(循环依赖)的,循环依赖,简单而言,就是A类中注入了B类,B类中注入了A类,首先贴出我的代码示例 @Component public class Add ...
- 修改并编译golang源码
最近为了做Hyperledger Fabric国密改造,涉及到了golang源码的改动.特将操作过程整理如下,以供参考: golang的源码安装其实比较简单,只需运行源码包中的脚本src/all.ba ...
- (转) Spring源码阅读 之 Spring整体架构
标签(空格分隔): Spring 声明:本文系转载,原地地址:spring framework 4 源码阅读 Spring骨架 Spring的骨架,也是Spring的核心包.主要包含三个内容 cont ...
- Spring源码分析:Spring IOC容器初始化
概述: Spring 对于Java 开发来说,以及算得上非常基础并且核心的框架了,在有一定开发经验后,阅读源码能更好的提高我们的编码能力并且让我们对其更加理解.俗话说知己知彼,百战不殆.当你对Spri ...
随机推荐
- Oracle 12cR1 RAC集群安装(一)--环境准备
基本环境 操作系统版本 RedHat6.7 数据库版本 12.1.0.2 数据库名称 testdb 数据库实例 testdb1.testdb2 (一)安装服务器硬件要求 配置项目 参数要求 网卡 每台 ...
- 解决socket粘包的两种low版模式 os.popen()和struct模块
os.popen()模式 server端 import socket import os phone = socket.socket() # 实例化一个socket对象 phone.bind((&qu ...
- (二十)c#Winform自定义控件-有后退的窗体
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- hadoop2.7之作业提交详解(上)
根据wordcount进行分析: import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; impo ...
- 浅谈python中文件和文件夹的相关操作
文件操作 文件的打开与关闭 打开文件 使用open(文件名,访问方式)函数,可以打开一个已存在的文件,或者创建一个新的文件. 示例如下: f = open('test.txt') # 访问方式可以省略 ...
- Swift项目引入第三方库的方法
以下,将创建一个Swift项目,然后引入3个库: Snappy 简化autolayout代码的库 Alamofire HTTP网络库,AFNetworking作者写的 SDWebImage 图片加载, ...
- Windows Server 2008 R2服务器内存使用率过高,但与任务管理器中进程占用内存和不一致
系统环境: Windows Server 2008 R2 + Sql Server 2008 R2 问题描述: Windows Server 2008 R2系统内存占用率过大,而在任务管理器中各进 ...
- Mybatis实现一对一查询 对ResultType和ResultMap分析
实现一对一查询: ResultMap:使用ResultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加 列名对应的属性,即可完成映射. 如果没有查询结果的特殊要求建议使用Resul ...
- helm安装kafka集群并测试其高可用性
介绍 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据. 这种动作( ...
- node.js 初学 自我笔记整理 day01
node.js 概念问题: Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. npm是一个node的包管理工具 ,也是一个网站 ,还是一条命令.N ...