Spring-frameWork-5.0.x源码编译踩坑
spring是java开发工程师避不过去的常用开发框架,能够提供方便的对象管理、低耦合面向切面、对上集成springMvc,Stucts,对下集成Mybatis,Hibernate框架,等等这些功能都对日常的开发帮助很大,但是想深入了解spring的原理、高级功能以及设计思想必须能够本地编译spring源码并将之运行起来,但是这一步基本都卡住了不少的人,当然,硬看代码的大佬除外哈。此文记录了本地编译spring源码的一些问题,最终将代码在本地跑起来。希望能给大家一点帮助。纯属娱乐,不喜勿碰。
代码下载
首先去GitHub上下载对应版本的spring代码,本文用到的是5.0.x,如下:
然后打开build.gradle文件,找到spring使用的gradle版本(spring-5.0.x使用的是gradle-4.4.1),为下一步安装gradle做准备,版本入下:
Gradle安装
首先下载对应版本gradle并安装,下载安装文件就不过多的做介绍,下载安装包解压即可,详情自行搜索;需要注意的是,安装过后需要配置环境变量、修改远程仓库源地址为国内镜像,同时配置本地仓库地址。
配置环境变量、配置本地仓库地址
需要在环境变量值配置GRADLE_HOME环境变量和CRADLE_USER_HOME来配置文档仓库路径。
修改镜像仓库为国内镜像
在gradle的安装目录的init.d目录下创建init.gradle文件,内容如下:
文件内容:
allprojects{
repositories {
def ALIYUN_REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public'
def ALIYUN_JCENTER_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
all {
ArtifactRepository repo ->
if(repo instanceof MavenArtifactRepository){
def url = repo.url.toString()
if (url.startsWith('https://repo1.maven.org/maven2')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
remove repo
}
if (url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
remove repo
}
}
}
maven {
url ALIYUN_REPOSITORY_URL
url ALIYUN_JCENTER_URL
}
}
}
到此,gradle安装完成
项目导入
代码下载到本地之后,导入idea,步骤如下,选择import project 选择本地代码路径,然后
选择import project from extenal model 选择Gradle,如下图
点击下一步,具体配置如下图
完成配置之后等待代码下载依赖以及编译,此处耗费很长时间,耐心等待,一两个小时是有可能的。但是一般编译或者下载依赖有问题都是正常的不要惊慌,一个个解决,我遇到的问题记录如下。
问题解决
编译时长过长或者编译报javadoc.options的错误
如果编译报如下错误,或者编译时间过长,找到build.graldle文件,注释掉里面的archives sorcesJar 和 archivesjavadocJar,问题如下图:
解决方式如下图:
自己建的子项目编译报错
错误如下,排查发现依赖了不需要的spring-webflux,在对应项目的.gradle文件中注释掉即可
解决方案如下图:
项目编译成功运行报错
项目编译成功后运行报错找不到对应的类,排查发现包含这些源码的工程没有引入到相应子工程,添加依赖即可,问题如下
解决方式如下:
编译一直报javadoc相关的错误
找到build.gradle中的javadoc配置,直接配置忽略编译时候的javadoc异常,可以解决大部分问题,配置如下图。
项目字符集要与工程配置的一致
找到build.gradle中关于字符集的配置,如下图:
都是UTF-8,那么idea中对于项目字符集配置也要是UTF-8,不让编译一直包字符集错误,特别是自己看代码加了中文注释之后,配置如下图:
项目镜像仓库更换国内镜像
项目编译下载依赖的时候spring的原生镜像仓库在近段时间下载需要认证,所以有些jar包或者插件下载会包401认证错误,将build.gradle文件关于镜像仓库的配置改为国内镜像即可。一般有两处如下图所示:
buildscript {
repositories {
maven {
url 'https://repo.spring.io/plugins-release' }
maven {
url "https://maven.aliyun.com/repository/apache-snapshots" }
maven {
url "https://maven.aliyun.com/repository/spring" }
maven {
url "https://maven.aliyun.com/repository/google" }
maven {
url 'https://maven.aliyun.com/repository/central'}
maven {
url "https://maven.aliyun.com/repository/public" }
mavenCentral()
maven {
url "https://repo.spring.io/libs-spring-framework-build" }
}
dependencies {
classpath("io.spring.gradle:propdeps-plugin:0.0.8")
classpath("io.spring.gradle:docbook-reference-plugin:0.3.1")
classpath("org.asciidoctor:asciidoctorj-pdf:1.5.0-alpha.16")
classpath("org.asciidoctor:asciidoctorj-epub3:1.5.0-alpha.7")
}
}
repositories {
// maven {
url "https://repo.spring.io/libs-release" }
maven {
url "https://maven.aliyun.com/repository/apache-snapshots" }
maven {
url "https://maven.aliyun.com/repository/spring" }
maven {
url "https: