错误: 找不到符号_Spring 5.1.x 源码阅读环境搭建及错误分析

4841eae5a9172f71c7fff42da2aabfa0.png 点击上面“蓝字”关注我们!

01

下载Spring源码

进入 Spring 官网进行下载

0399f340ae4c588c0a8fae8b797af6d0.png

我这里选择的是 5.1.x 版本的 Spring,然后点击 Clone or download,如果会 Git 可以使用 Git 命令的方式,不会的话选择下载 ZIP 压缩包,下载好之后需要解压。

63a218fef2d3a022305b22a91030e748.png

解压好之后,我们为 Spring 添加阿里云镜像。在编译过程中,Spring会去自动下载一些依赖的包,默认使用的是官方的镜像,下载比较慢,所以我们提前添加好国内镜像,将下面这行代码粘贴到 build.gradle 文件中的 repositories 节点下即可。

//添加阿里云镜像maven { url "http://maven.aliyun.com/nexus/content/groups/public" }

da94da331a6309e3b3b4b0dd7ad1c44a.png

02

前期运行环境与工具准备

JDK 版本:1.8.0_162 (版本1.8就行,我的是1.8最新版,高于1.8的没试过)。

JDK 下载地址:

https://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-zhs.html

b2b517d34a959fe52ea9a394faffb97c.png

我们这里使用 Gradle 搭建,所以还需要配置 Gradle 环境。

注意:这里会有一个问题,就是如果我们创建的项目和 Gradle 版本冲突了怎么办,也就是说 Spring 需要的版本和我们下载的版本不一致时怎么办?

解决:分两种情况,一种是系统没有 Gradle 环境,另一种是系统有 Gradle 环境。

第一种:我们先不配置 Gradle,进入本地 Spring 目录,在当前目录打开 cmd,输入命令:

gradlew :spring-oxm:compileTestJava

出现 BUILD SUCCESS 字样时说明构建成功,如下图所示

070ff43869da6035f502909f6f47a719.png

在 Spring-frameword-5.1x/.gradle 目录中可以看到 4.10.3,那么下载 4.10.3 版本即可。

c3cd89193f7a99e0a0096f13a7e20368.png

第二种:如果系统本身就有 Gradle 那么直接进行第三模块,导入 IDEA。在 IDEA 中编译 compileTestJava 即可,在 .gradle 目录中可以看到相应的 Gradle 版本。但是需要重新下载 Gradle 版本,重新进行配置。

1d8ba2924b47461f5c83ac31d0a90534.png

Gradle 配置教程

https://www.cnblogs.com/linkstar/p/7899191.html

ba85682a296829d2a9022b26b094e325.png

为了编译过程更快,我们为安装好的 Gradle 配置国内镜像。

进入 Gradle 安装目录,在 init.d 目录下新建一个 init.gradle 文件,并添加以下内容:

allprojects{    repositories {        def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/'        all { ArtifactRepository repo ->            def url = repo.url.toString()            if ((repo instanceof MavenArtifactRepository) && (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com'))) {                project.logger.lifecycle 'Repository ${repo.url} replaced by $REPOSITORY_URL .'                remove repo            }        }        maven {            url REPOSITORY_URL        }    }}

03

导入IDEA

点击 File->New->Project form Existing Sources... 打开项目。

2641557159ce20d670b6c474b63551ad.png

选择刚刚解压的 Spring 项目工程。

dbb92d67669f4d0e1e78702ae0297577.png

选择 Gradle。

73f3710eeba11ee813768597948945a5.png

选择自己配置的 Gradle 环境。

调整内存:

-XX:MaxPermSize=2048m -Xmx2048m -XX:MaxHeapSize=2048m

因为我是第二次配置 Gradle,所以我的重新创建 Spring 环境,没有这一步,如果有的话按照下面配置即可。

1186f967704085322641be143d7e166e.png

点击 Finish。

注意:在点击 finish 前,最好是能够开启 VPN,构建过程会要下载大量的依赖包跟插件,所以很慢,就算已经配置了阿里云镜像以及 Gradle,也会很慢,也可能是我网络的原因,说不清。

            d08d2b59057c7e345b07f39e3e5198ab.png    

下载过程:

b6b57e7ebf713be742a140754b311a65.png

项目导入到 IDEA 成功,如下图所示:

d49d92f9f1629bfe63304cc3b479ebba.png

04

开始编译

修改 docs.gradle 文件:

07084c412b1cf39323bff018dcb0b188.png

注释掉 dokka 和 asciidoctor 两个配置项:

因为在构建过程中执行这两个任务时会导致构建失败,这两个任务主要是用来生成文档使用,对主流程并没有任何影响,可以直接忽略,当然如果大家本地没有这个问题,也可以不注释。

a57f864ea81c61822f05bae49de489eb.png

64eb758e4f17c09957d4fbe0186e5082.png

替换 docs.gradle 文件中的 task schemaZip 代码:

在 Gradle 的构建脚本,只针对 Linux 系统做了适配,需要把 task schemaZip 替换成下面代码,因为原有代码的路径符号" / "是针对 Linux 的, Windows 使用会有问题,在 Windows 环境需要替换成" \\ ",否则会出现异常。

//这部分被替换了,所以需要被替换掉//task schemaZip(type: Zip) {//  group = "Distribution"//  baseName = "spring-framework"//  classifier = "schema"//  description = "Builds -${classifier} archive containing all " +//      "XSDs for deployment at https://springframework.org/schema."//  duplicatesStrategy 'exclude'//  moduleProjects.each { subproject ->//    def Properties schemas = new Properties();////    subproject.sourceSets.main.resources.find {//      (it.path.endsWith("META-INF/spring.schemas") || it.path.endsWith("META-INF\\spring.schemas"))//    }?.withInputStream { schemas.load(it) }////    for (def key : schemas.keySet()) {//      def shortName = key.replaceAll(/http.*schema.(.*).spring-.*/, '$1')//      assert shortName != key//      File xsdFile = subproject.sourceSets.main.resources.find {//        (it.path.endsWith(schemas.get(key)) || it.path.endsWith(schemas.get(key).replaceAll('\\/','\\\\')))//      }//      assert xsdFile != null//      into (shortName) {//        from xsdFile.path//      }//    }//  }//} //替换成如下代码即可task schemaZip(type: Zip) {     group = "Distribution"     baseName = "spring-framework"     classifier = "schema"     description = "Builds -${classifier} archive containing all " +             "XSDs for deployment at http://springframework.org/schema."     duplicatesStrategy 'exclude'     moduleProjects.each { subproject ->         def Properties schemas = new Properties();         subproject.sourceSets.main.resources.find {             it.path.endsWith("META-INF\\spring.schemas")         }?.withInputStream { schemas.load(it) }          for (def key : schemas.keySet()) {             def shortName = key.replaceAll(/http.*schema.(.*).spring-.*/, '$1')            assert shortName != key             File xsdFile = subproject.sourceSets.main.resources.find {                 it.path.endsWith(schemas.get(key).replaceAll('\\/','\\\\'))             }             assert xsdFile != null             into (shortName) {                 from xsdFile.path             }         }     } }

到现在编译前的准备工作才算完成。

05

根据文档步骤进行构建项目

打开 Spring 工程的 import-into-idea.md 文件:

import-into-idea.md 里面详细的描述了编译步骤,根据文档里面介绍,我们需要对 spring-core 和 spring-oxm 做预编译。

79c7d0b86867f18c0e731c27e81d8b94.png

预编译:

在 IDEA 中预编译很简单,按下图操作即可:

a54c444d269b08e60d29485792d8898d.png

注意:如果右侧没有 Gradle 那么可以在 View 中让它显示

56b54141a6dbc037ac4e18cd36d9b044.png

出现如下图所示,表示预编译成功。

eccaa2ab4bc9cacbe0e7f45a9ac5c9bd.png

上边的过程演示了 spring-oxm 的预编译,spring-core 和它同理这里就不演示了,成功显示如下图即可。

9ea479bf73fbe1e4e8c82aa6fc7433d8.png

终极编译:

对整个 Spring 项目构建,这个时候它会自动下载依赖包,如果有异常,会在控制台抛出并停止操作,编译整个工程,需要的时间很长很长。

f5f5eba0dc60b0f6af162ffe5a507173.png

构建成功在控制台可以看到下图提示

dfd2a302b50d164dcbcd932455439683.png

06

执行单元测试

即使整个项目没有 Error 或者红点,也不代表项目已经成功构建好了,我们还需要执行个单元测试试下,如果能顺利执行单元测试,那证明该项目已经构建成功,这里我用到的是 DispatcherServletTests 这个类,直接运行查看结果:

97efa61ee984b5e99f461c4ec84e1199.png

我第一次执行的时候报错了,错误如下:

039ae7161cc62c4d672817293a17a62a.png

网上找了很多解决办法还是没用

比如这个:

032f5357c66b666fa4c131631ff822de.png

结果出来的错误更离谱,网上根本找不到相关示例,最后实在是找不到只能重新再来一次

还有这个:

25fbaa519568ebfba30f0de2ea9f4007.png

这个还是不行,虽然报错没有更离谱,但是还是会有错误,只是错误没有改变罢了

还有这个:

00e962204c17461ea76c97b237a6c9b3.png

这个还是不行,把这个类注释掉,那么还会有其他类报错,最后根本注释不完

最后我也找了很久,终于让我找到了

视频参考:

https://www.bilibili.com/video/av76404922

解决办法就是将找不到符号的那个类的子模块的 build 文件删除,再次重新 build 一遍即可,如果还是不行那么把该模块的 text 文件中的代码重新运行 run 一遍,之后再运行测试类即可。之后如果还是显示找不到符号,重复上述步骤即可。

看完视频我的使用视频中的方式,之后还是会有其他的报错,但是报的错都是找不到符号,我还是使用同样的方法,进行重新 rebuild,之后再将 text 中的类重新运行 run 一遍即可。

ffe6599c03a540296e7e75154185184b.png

很明显,上面单元测试类的所有单测执行成功。

当我第二次安装的时候又遇到了不一样的坑

在编译 spring-aspect 的 javadoc 时我等了半个多小时还是不动,之后又重新弄了很多次,还是不行。

解决:注释掉 build.gradle 中的一些代码

//  javadoc {//    description = "Generates project-level javadoc for use in -javadoc jar"////    options.encoding = "UTF-8"//    options.memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PROTECTED//    options.author = true//    options.header = project.name//    options.use = true//    options.links(project.ext.javadocLinks)//    options.addStringOption("Xdoclint:none", "-quiet")////    // Suppress warnings due to cross-module @see and @link references.//    // Note that global 'api' task does display all warnings.//    logging.captureStandardError LogLevel.INFO//    logging.captureStandardOutput LogLevel.INFO  // suppress "## warnings" message//  }   task sourcesJar(type: Jar, dependsOn: classes) {    duplicatesStrategy = DuplicatesStrategy.EXCLUDE    classifier = "sources"    from sourceSets.main.allSource    // Don't include or exclude anything explicitly by default. See SPR-12085.  } //  task javadocJar(type: Jar) {//    classifier = "javadoc"//    from javadoc//  }   artifacts {    archives sourcesJar//    archives javadocJar  }}

07

其他坑

构建成功没报错,但运行单元测试有异常 ,提示类找不到

方案1:尝试点击右边菜单栏projects刷新项目,然后对Spring(Root)模块先clean再build一次。

方案2:针对找不到类的模块重新build一次。

方案3:点击Spring(root)模块下的Tasks->other->compileTestJava 执行一遍,针对test类编译一次即可。

构建失败,缺少依赖包

方案1:对Spring(Root)模块先clean再build一次(建议打开VPN,有可能存在某些包下载不成功导致)。

方案2:尝试针对当前模块执行buildDependents。

构建失败,执行gradle task失败

方案1:可能是当前运行环境版本不支持问题,如果不重要的问题,可以注释掉,保证构建正常。

构建失败,编码异常

方案1:可以通过idea工具设置:Editor-File encodings 全部设置为UTF-8。

这篇博客还会有一些其他的错误,我只遇到了第一种,其他的没有遇到,如果有人遇到了,希望可以帮到你。

https://blog.csdn.net/mjlfto/article/details/103838447

ac2f78895646b87505fe1701f8e67df9.png

f4113ceb65edef50f10b4ad4613b75fb.png

分享给第一个想到的人

f4113ceb65edef50f10b4ad4613b75fb.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值