Spring源码阅读之编译带源码的jar包

一、问题说明

我在调试源码时,有时需要新建一个项目来写单元测试,没有办法直接在源码的test包下面写

比如:我需要测试下spring的自定义标签(需要依赖spring-core、spring-context、spring-beans、spring-expression),还要在resources目录下创建META-INF文件夹,放入spring.handlers和spring.schemas文件(但是spring源码中本身已经把这个位置给占用了,源码里文件的名字是写死的)。

所以我要新建一个项目,然后引入spring的这几个jar包;我在之前看源码的时候,里面写了一些注释,我还想在打断点的时候能够看到自己写的源码注释,我需要编译一个带有源码的jar包

相关环境说明:

spring源码版本:分支5.1.x

idea版本 2018.1

gradle版本 4.6

jdk版本 1.8.0_61

二、解决过程

spring源码是使用gradle编译的,在spring-framework目录下有个build.gradle文件

Spring源码阅读之编译带源码的jar包_第1张图片

找到上面这一段,然后点开idea中gradle里的spring(root)->Tasks->sourcesJar,双击后稍等片刻,可以看到spring各个模块的工程下面出现了sources.jar结尾的源码包

Spring源码阅读之编译带源码的jar包_第2张图片

Spring源码阅读之编译带源码的jar包_第3张图片

中途遇到的问题:

1. 如果在cmd命令行(工作目录在spring-framework根目录下)中执行“gradlew sourcesJar”会报一个问题“GBK不可映射的字符”,网上搜了一下解决方法,只要在build.gralde中添加一段,编译就正常了

Spring源码阅读之编译带源码的jar包_第4张图片

2. 我在编译好以后看了下sources包里的文件

Spring源码阅读之编译带源码的jar包_第5张图片

 如果我新建一个maven项目的话,对应每个spring模块有两个包(classes包和sources包)。现在我只想采用本地引入的方式使用jar包(scope设置为system),我想让编译出的源码包里同时有class文件和java文件,在用的时候关联源码包直接用一个包就好了

google了一下(搜索gradle compile jar with source code,找到https://discuss.gradle.org/t/build-jar-files-which-includes-class-and-java-files/13139/3)

改了下build.gradle,我在task javadocJar后面追加了一段

Spring源码阅读之编译带源码的jar包_第6张图片

然后在cmd中执行“gradlew sourcesBinJar”,生成sources包,现在看下spring-beans里的文件

Spring源码阅读之编译带源码的jar包_第7张图片

然后我在自己的maven测试工程中引入,

 Spring源码阅读之编译带源码的jar包_第8张图片

如果引入的依赖比较多的话,一个个关联源码还是比较麻烦的。引入maven依赖后,可以批量关联源码

Spring源码阅读之编译带源码的jar包_第9张图片

参考链接:https://discuss.gradle.org/t/build-jar-files-which-includes-class-and-java-files/13139/3

 

你可能感兴趣的:(spring)