IDEA构造Spring5源码阅读环境
Posted 加耀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IDEA构造Spring5源码阅读环境相关的知识,希望对你有一定的参考价值。
相信每一个从事java开发的小伙伴,肯定对Spring的源码拥有浓厚的兴趣的,它有助于我们对Spring的理解和认知。打造一个良好的Spring阅读环境是必不可少的;
那么,在这里我将自己的Spring源码构造过程记录于此,希望可以帮助到有需要的朋友;
在学习Spring之前,我们先来聊一聊Spring是什么;相信这应该也是一个面试中常被问到的问题;我们每天都在用Spring,那么,究竟spring是什么呢;
Spring可以理解成一家公司,他的官网是:https://spring.io,他们提供了很多优秀的开源项目,项目列表https://spring.io/projects,里面包含Spring framework、SpringBoot、Spring Cloud、Spring session等等项目,而我们经常提到的AOP和IOC仅仅是Spring framework里面比较核心的两个组件,里面还有很多其它的核心的组件;
所以在面试的时候,Spring 不等于 AOP和IOC;如果对Spring的IOC容器比较感兴趣的话可以看一下spring官网的文档简介https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html;
由于Spring是使用的Gradle编译的,所以我们需要配置好Gradle的环境(和maven一样),我这边使用的是4.9版本的https://gradle.org/releases/,我下载的Spring源码是5.0.x版本的https://github.com/spring-projects/spring-framework,jdk版本是1.8.0_131版本;如果可以的话大家尽量环境保持和我这边一致;
打开源码的根路径,我们会看到一个import-into-idea.md的文件,在文件中有写到这样几句话
1. Precompile `spring-oxm` with `./gradlew :spring-oxm:compileTestJava`
2. Import into IntelliJ (File -> New -> Project from Existing Sources -> Navigate to directory -> Select build.gradle)
3. When prompted exclude the `spring-aspects` module (or after the import via File-> Project Structure -> Modules)
4. Code away
## Known issues
1. `spring-core` and `spring-oxm` should be pre-compiled due to repackaged dependencies.
See `*RepackJar` tasks in the build and https://youtrack.jetbrains.com/issue/IDEA-160605).
2. `spring-aspects` does not compile due to references to aspect types unknown to
IntelliJ IDEA. See https://youtrack.jetbrains.com/issue/IDEA-64446 for details. In the meantime, the
'spring-aspects' can be excluded from the project to avoid compilation errors.
3. While JUnit tests pass from the command line with Gradle, some may fail when run from
IntelliJ IDEA. Resolving this is a work in progress. If attempting to run all JUnit tests from within
IntelliJ IDEA, you will likely need to set the following VM options to avoid out of memory errors:
-XX:MaxPermSize=2048m -Xmx2048m -XX:MaxHeapSize=2048m
4. If you invoke "Rebuild Project" in the IDE, you'll have to generate some test
resources of the `spring-oxm` module again (`./gradlew :spring-oxm:compileTestJava`)
大致意思就是需要我们在根路径下执行./gradlew :spring-oxm:compileTestJava ,在这里执行会下载大量的jar包,可能会出现很多的错误,大部分情况下重试可以解决问题;大多数问题都是因为网络缘故导致的。同时,由于spring中的AOP是基于spring-aspects来实现的,这里需要单独引用包,所以文档中的推荐是进入开发工具中将spring-aspects进行排除;
我在这里是通过来回切换VPN实现的,从而将所有的jar包下载下来了;如果在这里执行一直出错的话,也可以跳过这一步骤,在IDEA中进行编译;
打开IDEA,File à New àProject form Existing Sources ,选择源码根路径下的build.gradle文件进行导入,
打开源码后,Gradle会根据项目中的源码下载大量的jar包,下载时间会比较长,三四个小时左右,中途会下载失败然后来来回回的刷新重新下载,直到右边的Gadle中的项目不再报错;
这个过程中会遇到很多的问题,千奇百怪的问题,但是也会有很多人在这个步骤中是非常顺利的;我最开始就是勾选了使用本地的gradle,勾选后我这边遇到了很多很多的问题,后来在导入的时候取消了勾选,很多问题响应的都消失了;
刚开始导包的时候会发现右侧的Gradle功能栏中没有项目,当idea下载jar包下载的差不多了的时候这个就会出来了;不过还是需要想办法把所有的jar包下载下来,一两次可能会下载不全;
在下载包的过程中,我们可以先根据import-into-idea.md文件中所描述的那样,排除import-into-idea.md
下载jar包需要反复的下载,中途可能会因为网络缘故导致下载失败,重新刷新Gradle即可;等所有的包都下载完成后,可以点击左上角的File à New à Module… 新建一个模块,创建完成后Gradle会重新加载;
由于其它模块依赖于spring-oxm和spring-context以及spring-beans,所以需要先将这两个模块进行编译,在Gradle中找到对应模块,选择Tasks,然后选择compileTestJava依次进行编译;
此处编译可能还会遇到各种各样的问题;
比如,经常会报错的错里面会带 Kotlin之类的,这个需要在Idea中安装Kotlin插件然后重启Idea;没有安装Kotlin的话会报错
Error:Kotlin: [Internal Error] java.lang.IllegalStateException:
The provided plugin org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationComponentRegistrar
is not compatible with this version of compiler
安装了Kotlin插件后,还需要修改Kotlin插件的配置,和spring源码的版本不兼容,具体修改地方如下:
另外还需要修改代码中的Kotlin版本号,在源码根路径下的build.gradle文件中,修改Kotlin版本为1.2
kotlinVersion = "1.2.0"
然后还会遇到gradle文件的错误,这个需要注释一点代码,分别是spring-beans中的28行和29行,也就是
//compileGroovy.dependsOn = compileGroovy.taskDependencies.values - "compileJava"
//compileKotlin.dependsOn(compileGroovy)
这两行代码需要注视掉;
另外,还一直报错InstrumentationSavingAgent 不存在的错误,这个问题把百度和谷歌翻了个遍,最后找到问题的点是在spring-context.gradle文件中有一行代码需要修改一下,
原来是
optional(project(":spring-instrument"))
需要修改为
compile(project(":spring-instrument"))
同时,也可以将配置的Gradle修改为指定的Gradle,在这个时候可以改回来;
然后我们只需要在我们创建的这个模块中引入spring的依赖即可,然后我们可以新建一个测试类,使用@Commont注解,然后编写一个Main方法进行测试,即可访问到Spring源码;具体改动如下:
编写一个配置类MyConf.java
package com.ard.conf;
import com.ard.model.UserService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 配置类
*/
@Configuration
public class MyConf {
@Bean
public UserService userService(){
return new UserService();
}
}
编写一个实体类
package com.ard.model;
/**
* 实体类
* @author: jiaYao
*/
public class UserService {
}
编写一个Main方法
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConf.class);
String[] names = context.getBeanDefinitionNames();
for (String beanName : names){
System.out.println(beanName);
}
}
运行实例图
最后的运行输出:
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
myConf
userService
整个spring源码环境搭建过程花了将近一周的时间才完成,中途遇到了各种各样的错误;在文章中记录的可能还漏掉了一部分,并且,每个人所遇到的情况可能还是不一样的,但是总结了一下,大部分的问题都是网络原因导致的,然后其他的就是计算机本地环境等。
以上是关于IDEA构造Spring5源码阅读环境的主要内容,如果未能解决你的问题,请参考以下文章