spring源码的构建并不是通过maven构建的,而且编译也不仅仅是通过javac编译的,比如spring AOP的编译就必须用到aspectj编译器。这些在以下都会一一讲解,是一个从新的spring源码文件到能完整跑起来的全构建流程。我构建的是spring5.2.x版本,jdk1.8,gradle5.6.4。之前尝试过构建spring5.3.x版本,但是在编译spring aop期间总是报错,可能是我下错了aspectj编译器包,但是之后我还是果断放弃了5.3.x版本的构建,因为这个版本需要jdk11,和我平时工作的项目jdk8冲突,切环境麻烦并且花了很长时间还没解决spring aop编译问题。有兴趣可以尝试下,如果构建成功了,希望可以一起交流交流。如果怕麻烦,目的很明确,就是去学习spring源码的,不想节外生枝,可以选择5.2.x版本照这个本文构建即可。祝大家更上一层楼!!!
1、下载spring源码
github下载地址:https://github.com/spring-projects/spring-framework
gitee下载地址:https://gitee.com/mirrors/Spring-Framework
我用的是gitee下载,因为github下载得太慢了!
2、查看spring源码推荐版本
其实就算我们不配置gradle环境,idea在编译spring源码得时候,还是会自动得下载默认支持得gradle包,这个配置在Spring源码根目录下的gradle包的wrapper中
让我们来修改这个文件
上述修改后的地址就是我下载gradle存放的地址,注释掉原有地址,防止自动下载(那叫一个慢)。注:这边配的就是zip包,不是解压后的文件夹,不用惊讶!这个配置的地址里不要有空格之类地特殊字符,反正我试了很多次,空格字符会导致后面包不规范字符的错误,进行unicode转码都不管用,反正就正常配置就好,别骚
3、下载gradle,全局配置环境
官方网站:https://gradle.org/install/#manually
急速通道:https://services.gradle.org/distributions/
不用想,我是那种等待超过五分钟就会烦躁的人,我选择急速通道。
下载下来后,我是放在了D盘下:D:\gradle-5.6.4-bin.zip
解压后:D:\gradle-5.6.4
4、配置环境变量和仓库源
(1)配置环境变量
新建变量:GRADLE_HOME ,gradle总目录
新建变量:GRADLE_USER_HOME ,自定义的Gradle仓库目录(在gradle-wrapper.properties文件中需要),我是在gradle下建了个repository文件夹,你可以放在自己想放的地方。
添加变量 :将gradle的bin放入path中,以便系统直接读取命令并执行
配置环境变量就完成了,其实这个时候gradle环境就已经配置好了,我们来验证下,cmd出黑窗口后,执行gradle -v,如下:
(2)配置gradle仓库源
默认是用的国外的数据源,下载那叫一个慢,还极有可能因为慢导致失败。所以,我们配置国内数据源。
在Gradle安装目录下的 init.d 文件夹下,新建一个 init.gradle 文件,里面填写以下配置。
allprojects {
repositories {
maven { url 'file:///D:/gradle-6.8.3/repository'}
mavenLocal()
maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }
maven { name "Bstek" ; url "http://nexus.bsdn.org/content/groups/public/" }
mavenCentral()
}
buildscript {
repositories {
maven { name "Alibaba" ; url 'https://maven.aliyun.com/repository/public' }
maven { name "Bstek" ; url 'http://nexus.bsdn.org/content/groups/public/' }
maven { name "M2" ; url 'https://plugins.gradle.org/m2/' }
}
}
}
repositories 中写的是获取 jar 包的顺序。先是本地的 Maven 仓库路径;接着的 mavenLocal() 是获取 Maven 本地仓库的路径,应该是和第一条一样,但是不冲突;第三条和第四条是从国内和国外的网络上仓库获取;最后的 mavenCentral() 是从Apache提供的中央仓库获取 jar 包。
5、配置spring源码的仓库源
在源码的根路径找到build.gradle文件,在repositories配置项中加入下面的代码,修改maven地址为阿里云仓库。
// 新增阿里云仓库
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/'}
// 新增springsource仓库
maven { url "http://repo.springsource.org/plugins-release" }
maven { url "https://repo.spring.io/plugins-release" }
修改后如下:
6、进入构建源码
进入源码根目录,直接运行gradlew.bat(windows下双击),其实就是在下载需要的jar包,耐心等待即可,需要很长时间,下载完成后,运行框会自动消失
运行中:
接下来就只要按照spring源码根目录下import-into-idea.md文件的指引去做就可以了。
第一步:进入spring根目录,进入黑窗口或者git窗口,运行 ./gradlew :spring-oxm:compileTestJava ,成功后如下图
然后就可以将spring源码导入到idea中了
导入idea后,第一件事就是将gradle环境修改成我们自己配置的gradle,如下图
到这里,千万不要操之过急
然后点build project,构建项目。
这个也需要些时间的,成功后,如下。
如果以上步骤都成功了,那就表明你现在容器服务可以用了,那就创建个demo跑一下吧。(到这里AOP服务还是不能使用的,若要使用还得继续配置)
7、顺便将运行AOP的环境给配置了
- 下载AspectJ编译包:https://www.eclipse.org/aspectj/downloads.php
- 运行下载的jar包,在黑窗户运行 java -jar aspectj-1.9.6.jar,就像运行springboot项目一样。
- 回车后会出现安装界面,一直点下一步就行了,但是需要选择jdk目录,安装目录。这些目录自己选择即可。
- 安装完成后来到idea进行配置
选择spring:spring-aop.main表示这个项目使用Ajc编译,如果这个项目下有其他编译方式,请自行删除。一般没有
同样的,spring.spring-aspects.mian同样操作,得到最终结果如下图
这时候切换编译器,是项目支持Ajc编译
到这里其实就完成了,接下来就看看能否正常使用AOP服务了。首先,在demo项目中加入AOP的依赖支持
接着,在启动配置类上加上@EnableAspectJAutoProxy,表示运行时加入AOP相关功能。
接下来就是再次跑一下了(仍然可以正常运行,那就没问题了),如果实在不放心,可以写个切面类,测试下AOP功能。
到这里就结素了,有问题留言讨论哈