【Spring 源码学习】Spring 源码环境搭建-3.2.x

 2023-01-04
原文作者:BraveWang 原文地址:https://juejin.cn/post/7029340747451072519

一,前言

Spring 源码学习,需要搭建一个 Spring 源码的运行环境,需要做以下几件事:

  1. 安装 JDK(略);
  2. 从 GitHub 获取 Spring 源码;
  3. 安装 Gradle(略);
  4. 安装 IDE-eclipse,并导入源码(安装 Gradle 插件);

由于我们打算使用 spring3.2.x 源码进行环境搭建,而目前这一版本的搭建过程有很多坑; 在网上也搜罗了一些博文,几乎都不能实现,所以这里把我的搭建过程记录下来,和大家分享;


二,获取Spring源码

通过 GitHub 获取 Spring 源码(以 Spring 3.2.x 为例):

Spring 3.2.x 源码 github 地址


三,下载 Spring 各模块依赖的 jar 包

本来想将源码导入到 IDEA,查看了源码目录下的 import-into-idea.md,介绍如何将源码导入 idea:

202301012105355231.png

按照说明,执行了第一步发现并没有成功,所以直接执行 gradlew 命令:

202301012105361602.png

导入 Idea -> 选择 gradle,等待下载文件,这种方式需要解决很多代码错误,我们先TODO,暂时选用 eclipse;


Spring源码目录结构如下:

202301012105367573.png

由于 GitHub 上的 Spring 源码由 Gradle 构建,需下载 Spring 各模块依赖的jar 包;

所以不能立即导入到 IDE,并且需要 gradle 命令生成对应的 IDE 文件; // TODO 需要一篇 gradle 生成 eclipse 和 idea 项目的文章;

以 eclipse 为例,导入 eclipse 的项目需要 .project 和.classpath 文件,需要执行 gradle 命令:

    gradle cleanidea eclipse
    或
    gradle eclipse -x :eclipse

打开命令窗口,将当前目录切换至 Spring 源码所在目录,并执行gradle cleanidea eclipse

这里需要注意: 执行gradle cleanidea eclipse后生成的代码的jar依赖关系路径为当前源码所在目录

这将影响我们后面导入包的依赖路径

转换eclipse:

202301012105372164.png

转换成功:

202301012105377545.png

等待项目转换完成后导入IDE

注意: Spring 源码根路径下的 build.gradle 文件中有类似这样一句:

    compileJava {
        sourceCompatibility = 1.6
        targetCompatibility = 1.6
    }
    
    compileTestJava {
        sourceCompatibility = 1.8
        targetCompatibility = 1.8
        options.compilerArgs += "-parameters"
    }

是指定源码编译使用 jdk1.6,测试代码编译使用 jdk1.8,也就是说当前编译我们需要安装 jdk1.8;


四,将Spring源码导入IDE

通过 eclipse -> import 导入 Spring-framework 源码目录:

202301012105382836.png

导入完成目录,会有很多报错:

202301012105388517.png

项目右键BulidPath:

202301012105394958.png

发现缺少两个jar包:

  • spring-cglib-repack-3.1.0.jar
  • spring-asm-repack-5.0.4.jar

202301012105402349.png


五,解决 Spring 源码 jar 包缺失问题

这里我们要问了:这么多jar包都不缺,为什么缺这俩,而且细看发现很多模块都缺这俩;

我们对项目做了一个搜索(当然这里是已经知道原因了,只是把说明抓出来给大家看看)

2023010121054089310.png

打开 gclib 的 jar缺失文件

img.blog.csdn.net/20180202014…

所以,我们知道:

    Spring为了避免第三方class的冲突,repack掉了cglib和asm的jar

问题清晰了,我们就来解决问题:

    正常来讲,需要下载高版本Spring源码,找到这两部分的代码自己打JAR包

这里,直接给出jar:

2023010121054167511.png

将Jar导入工程,放在 spring-core 工程的 build/lib 目录下面,并 clean 工程重新 Build;


六,eclipse-Tomcat配置问题

解决了以上问题Build项目依然会报错

2023010121054219112.png

这是因为eclipse没有配置tomcat,导致web工程报错

2023010121054277013.png


七,spring-oxm模块jar缺失问题

clean 并重新 Build 后,发现还有少 jar 的情况:

2023010121054345514.png

显示在 spring-oxm 模块仍缺失3个jar包,在 spring-oxm 我们发现了oxm.gradle 文件:

2023010121054410915.png

oxm.gradle 类似 Maven 的 pom 文件,其中记录了项目依赖的 jar 信息:

2023010121054471816.png

我们可以看到包名,并通过命令行执行 gradle 命令下载 jar;

进入 spring-oms 目录,执行 gradle+空格+task名;

下载完成后,进入 gradle 仓库找到 jar,并导入工程;

gradle下载jar的默认路径:

  • Mac系统默认下载到:/Users/(用户名)/.gradle/caches/modules-2/files-2.1
  • Windows系统默认下载到:C:\Users(用户名).gradle\caches\modules-2\files-2.1

2023010121054563917.png

更简单的方法是:安装 eclipse-gradle 插件:

利用 Install new softwate -> Install,输入插件网址 dist.springsource.com/release/TOO… 安装完需要重启 Eclipse;

2023010121054633118.png

插件生效后使用插件将项目转换为gradle项目:

2023010121054722619.png

转换完成后,使用插件下载jar

2023010121054789320.png

这里可能会报一个错误:

    error in opening zip file
    Could not install Gradle distribution from 'https://services.gradle.org/distributions/gradle-2.2.1-bin.zip'.

选择需要的版本下载这个文件,并放入Gradle文件:

    https://services.gradle.org/distributions/

导入路径:

2023010121054865121.png

重新Build工程,不再报错:

2023010121054921222.png

    [sts] -----------------------------------------------------
    [sts] Starting Gradle build for the following tasks: 
    [sts]      :spring-oxm:cleanEclipse
    [sts]      :spring-oxm:eclipse
    [sts] -----------------------------------------------------
    :buildSrc:compileJava UP-TO-DATE
    :buildSrc:compileGroovy UP-TO-DATE
    :buildSrc:processResources UP-TO-DATE
    :buildSrc:classes UP-TO-DATE
    :buildSrc:jar UP-TO-DATE
    :buildSrc:assemble UP-TO-DATE
    :buildSrc:compileTestJava UP-TO-DATE
    :buildSrc:compileTestGroovy UP-TO-DATE
    :buildSrc:processTestResources UP-TO-DATE
    :buildSrc:testClasses UP-TO-DATE
    :buildSrc:test UP-TO-DATE
    :buildSrc:check UP-TO-DATE
    :buildSrc:build UP-TO-DATE
    :spring-oxm:cleanEclipseClasspath
    :spring-oxm:cleanEclipseJdt
    :spring-oxm:cleanEclipseJdtUi
    :spring-oxm:cleanEclipseProject
    :spring-oxm:cleanEclipse
    :spring-oxm:eclipseClasspath
    :spring-oxm:eclipseJdtPrepare
    :spring-oxm:eclipseJdt
    :spring-oxm:eclipseProject
    :spring-oxm:eclipseSettings
    :spring-oxm:eclipseWstComponent
    :spring-oxm:eclipse
    
    BUILD SUCCESSFUL
    
    Total time: 3.411 secs
    [sts] -----------------------------------------------------
    [sts] Build finished succesfully!
    [sts] Time taken: 0 min, 3 sec
    [sts] -----------------------------------------------------

之后 spring-oxm 继续报错:

2023010121055000923.png

需要 spring-oxm 项目右键 -> Gradle(STS) -> Enable Dependency Managemrnt:

2023010121055078424.png

之后可能继续出现:Flight cannot be resolved to a type 错误


八,jre版本问题

导入了上边缺失的jar后,重新Build还会报错误:

2023010121055150825.png

这是jre的问题,我们重新设置一下就好

2023010121055241426.png

点击 Add Librart,选择JRE System Library重新添加 jre:

2023010121055364427.png


九,spring-test-mvc项目依赖问题

spring-test-mvc项目缺一个依赖:spring-webmvc-tiles3,添加依赖即可修复


十,spring-oxm模块test报错

2023010121055443628.png

2023010121055515029.png

这里的 test 报错其实是 spring 源码中的一个错误,需要我们手动修改一下: 这里也是本次源码导入最耗时的一个步骤了,看了报错的类,觉得可能是代码有问题 于是一步一步尝试修改了好久,最后,无意间找到了这个,对照修复即可: code.taobao.org/p/cnspring/…

这里我们也可以直接注释掉报错的 test 代码;


十一,Could not find com.itextpdf:itextpdf:4.2.2

有可能会报出这个错误:

img-blog.csdn.net/20180207125…

  • 错误原因: 因为3.2的版本比较久远,很多类库已经更新变化了
  • 修改方法: 1)gradle 仓库下找到 ivy.xml C:\Users\Brave.gradle\caches\artifacts-24 \f103b4baf7311290346105b788d3b582 找到ivy.xml

2)将 dependency org="com.itextpdf" name="itextpdf" rev="4.2.2" 修改为 dependency dependency org="com.itextpdf" name="itextpdf" rev="5.2.0",

    <dependencies>
        <dependency org="com.itextpdf" name="itextpdf" rev=“4.2.2" force="true" 
        conf="default->default;master->master;compile->compile;provided->provided;
        runtime->runtime;system->system;sources->sources;javadoc->javadoc;
        optional->optional"/>
    </dependencies>
    修改为:
    <dependencies>
        <dependency org="com.itextpdf" name="itextpdf" rev="5.2.0" force="true" 
        conf="default->default;master->master;compile->compile;provided->provided;
        runtime->runtime;system->system;sources->sources;javadoc->javadoc;
        optional->optional"/>
    </dependencies>

十二,项目导入完成

到这里,我们解决了导入过程的所有问题,Spring源码Build成功

最后我们回顾一下全部流程;

  1. 下载源码并解压;
  2. 将源码放到合适的路径,执行命令 gradle cleanidea eclipse;
  3. 下载依赖完成后,导入 IDE;
  4. 解决 spring-core 模块的 jar 缺失问题(添加到spring-core/build/libs);
  5. 使用 gradle 插件将 spring-oxm 转换成为 gradle 项目,并下载 jar 文件;
  6. spring-oxm 项目右键->Gradle(STS)->Enable Dependency Managemrnt;
  7. 处理依赖模块 jre 报错问题;
  8. 解决spring-oxm 模块 test 报错;