上周在定位问题时,发现Spring容器实例化Bean的时候抛出异常,为了查看更详细的信息,决定修改spring-context-4.0.2.RELEASE.jar中的CommonAnnotationBeanPostProcessor类的代码,在里面打印出更详细的信息,以便咱们分析和定位问题,下面咱们一步一步经过实战来修改和编译spring-context的源码;java
下载源码的第一步,是找个用到了spring-context-4.0.2.RELEASE.jar的java工程,若是读者您手里没有现成的工程,能够在个人git上下载,地址:https://github.com/zq2599/blog_demosgit
下载后能够发现里面有不少工程,本次实战用的工程是springmybatisexceptiondemo,以下图红框所示:程序员
用命令行进入pom.xml所在的目录下,执行命令mvn dependency:sources,便可下载全部依赖库的源码包,以下图:github
此时进入maven的本地仓库,找到spring-context的目录,在里面就能看到源码的jar包,以下图:web
maven的本地仓库,通常在用户目录的.m2文件夹下;spring
在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都解压;缓存
新建一个maven工程,pom文件的内容和spring-context-4.0.2.RELEASE.pom的如出一辙,以下图:tomcat
进入刚才解压的spring-context-4.0.2.RELEASE-sources.jar的文件夹,把里面的org文件夹整个都复制到新建的maven工程的java文件夹下,以下图所示:mybatis
只复制java文件是不够的,还要复制META-INF和xsd文件,这些东西都不在spring-context-4.0.2.RELEASE-sources.jar包中,还记得刚刚咱们把spring-context-4.0.2.RELEASE.jar文件也解压了么?META-INF和xsd文件在这个解压的文件夹中能够找到;maven
先是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/configorg/springframework/ejb/configorg/springframework/scheduling/configorg/springframework/scripting/config
在上面所建的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,在控制台能够看到打印出了比之前更多的异常堆栈内容,便于咱们定位问题: