这两天一直在解决编译spring源码的问题,期间失败了无数次。当然失败的原因也各不相同,下面我主要列举我在编译期间遇到的问题进行记录。如果大伙儿遇到相同的问题,希望可以给到解决的灵感。好了话不多说,我先来说说编译spring的前期准备。
准备:1、在github上下载源码 可以git clone 或者 down zip
2、下载gradle
3、IDEA 这个不用多说
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
现在手中我已经有了spring的源码,打开里面是这些文件
1、和大多数博客写的一样,首先如果你导入IDEA,那么点开import-into-idea.md,到project的根目录下 cmd运行 gradlew :spring-oxm:compileTestJava
-
Precompile
spring-oxm
with./gradlew :spring-oxm:compileTestJava
-
Import into IntelliJ (File -> New -> Project from Existing Sources -> Navigate to directory -> Select build.gradle)
-
When prompted exclude the
spring-aspects
module (or after the import via File-> Project Structure -> Modules) -
注意:这期间一般会失败多次 ,然后这个命令还会下载一个新的gradle(虽然我不太喜欢这样,毕竟我自己已经下了一个). 由于时间太长了,所以我们还需要配置gradle国内镜像源。后来为了使用这个新下载的gradle,所以我在C:\Users\xxx\.gradle\wrapper\dists\gradle-6.4-bin\aj6cyggqps6mdbpl6cfppfwqk\gradle-6.4 这个目录下,新建init.d文件夹,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 } } }
第二个要注意的是,虽然这里全局配置了阿里的镜像源,但是并不是所有的版本阿里镜像源都有,所以在后面jar包因为版本问题无法下载时,你最后把这个文件再删除了。就不走全局的配置了。
第三个要注意的是,如果明明联网了,但是还是不能下载,那么就连手机热点把 这个方法有时候有点用。
2、当上一步完成后,其实就可以导入IDEA了。
再导入源码之前,我建议你先到这个界面,在设置里面把gradle maven 之类配置好。
3、点击open后,IDEA就会帮你自动导入。在此期间它会帮你继续下载需要的jar包,还记的我上面说的如果没办法下载了 记得连连手机热点,并且删除init.gradle试试。
这里需要注意的是,你最好再更改下settings.gradle里面的
pluginManagement {
repositories {
maven {url "http://maven.aliyun.com/nexus/content/groups/public/" }
mavenCentral()
gradlePluginPortal()
maven { url 'https://repo.spring.io/plugins-release' }
maven { url "https://maven.aliyun.com/repository/spring-plugin" }
}
}
这里可以帮你加速下载jar 。以及build.gradle中的
repositories {
maven {url "http://maven.aliyun.com/nexus/content/groups/public/" }
maven {url "http://maven.aliyun.com/nexus/content/repositories/jcenter"}
mavenCentral()
maven { url "https://repo.spring.io/libs-spring-framework-build" }
}
4、如果以上步骤,均没有问题那么你会得到一个新的界面:
gradle是可以展开的。
接下来你就需要测试了,这里挂一个链接:https://www.bilibili.com/video/BV1XJ41117tT?from=search&seid=11806535173146251076 这个视频说了如何测试。
但是我要说的是,按照视频里面会出现一个错误:
spring 编译 出的错误 Error:(347, 51) java: 找不到符号 符号: 变量 CoroutinesUtils 位置:
当然,很多博主都对这个问题做出了解决:https://blog.csdn.net/gooaaee/article/details/104437902
但是我要说的是,按照上面说的后,其实不用不用再编译整个spring的项目了,直接run即可,那么就出现了: