编译spring5.2.x源码

编译spring源码是学习spring的第一步,spring源码是用gradle编译的,在编译时会遇到一些问题,在此记录一下。

下载spring源码

第一步需要下载spring的源码,由于官方托管在github,国内访问github不通畅,这里就直接使用gitee的镜像仓库,在国内比较快,地址:https://gitee.com/mirrors/spring-framework

我们可以直接fork出一份到自己的仓库中,然后克隆到自己本地。
这里我使用5.2.x分支作为源码阅读分支。

下载gradle并安装

gradle使用5.6.4版本。安装方式参考百度,和maven基本一致。
gradle在国内访问比较慢,我放到百度云盘上了。

链接:https://pan.baidu.com/s/1_vVFJBep1p6nM8EilG-RYg
提取码:zfh1

修改Spring源码包下的gradle相关配置文件

修改gradle/wrapper/gradle-wrapper.properties 文件

该文件distributionUrl值默认是从官网上下载gradle,我们下载过了,这里直接配置成本地地址

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
#distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip
distributionUrl=file:///F:/soft/gradle-5.6.4-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

修改根目录下build.gradle

中央仓库配置为阿里云的,下载依赖更快

repositories {
maven { url "https://maven.aliyun.com/nexus/content/groups/public" }
maven { url "https://maven.aliyun.com/nexus/content/repositories/jcenter" }
mavenCentral()
maven { url "https://repo.spring.io/libs-spring-framework-build" }
}

修改buildSrc/build.gradle配置

同样配置阿里云中央仓库

repositories {
maven{ url 'https://maven.aliyun.com/nexus/content/groups/public/'}
maven{ url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
mavenCentral()
gradlePluginPortal()
}

使用Gradle编译Spring环境

执行gradlew.bat

image.png

执行gradlew :spring-oxm:compileTestJava

image.png

执行gradlew :spring-core:compileTestJava

image.png

F:\dev\my\spring-framework>gradle.bat
Starting a Gradle Daemon (subsequent builds will be faster)
> Task :help
Welcome to Gradle 5.6.4.
To run a build, run gradle <task> ...
To see a list of available tasks, run gradle tasks
To see a list of command-line options, run gradle --help
To see more detail about a task, run gradle help --task <task>
For troubleshooting, visit https://help.gradle.org
BUILD SUCCESSFUL in 41s
1 actionable task: 1 executed
F:\dev\my\spring-framework>gradlew :spring-oxm:compileTestJava
Downloading file:/F:/soft/gradle-5.6.4-all.zip
........................................................................................................................
> Task :spring-oxm:genJaxb
[ant:javac] : warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
BUILD SUCCESSFUL in 47s
40 actionable tasks: 24 executed, 16 from cache
F:\dev\my\spring-framework>gradlew :spring-core:compileTestJava
BUILD SUCCESSFUL in 6s
17 actionable tasks: 2 from cache, 15 up-to-date

idea配置

上面执行完之后,可以把源码导入idea中,我们需要在idea中配置下gradle

image.png

配置完之后,将整个项目进行编译
image.png

创建测试模块,测试可用性

创建一个新的模块mytest,如下所示:
image.png

build.gradle文件更改,加入spring模块依赖:

dependencies {
testImplementation(platform("org.junit:junit-bom:5.9.1"))
testImplementation("org.junit.jupiter:junit-jupiter")
compile(project(":spring-beans"))
compile(project(":spring-core"))
compile(project(":spring-context"))
compile(project(":spring-aop"))
}

新建配置文件:spring-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myTestBean" class="org.springframework.test.TestBean"/>
</beans>

创建java类:TestBean

package org.springframework.test;
import org.springframework.stereotype.Component;
@Component
public class TestBean {
private String name = "me";
public TestBean(String name) {
this.name = name;
}
public TestBean() {
}
@Override
public String toString() {
return "MyTestBean{" +
"name='" + name + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

执行测试:

package org.springframework.test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("org.springframework.test");
TestBean bean = context.getBean(TestBean.class);
System.out.println("anno - " + bean);
ClassPathXmlApplicationContext context1 = new ClassPathXmlApplicationContext("classpath:spring-config.xml");
Object myTestBean = context1.getBean("myTestBean");
System.out.println("xml - " + myTestBean);
}
}

可能遇到问题:

  1. Plugin with id 'java-test-fixtures' not found.
    使用gradle固定版本

  2. No tests found for given includes: [**/Tests.class, **/Test.class]......
    进入 Gradle 设置页面:File -> Settings -> Build,Execution,Deployment -> Build Tools -> Gradle
    修改:将 Gradle Projects 面板中的 Run tests using 选项值改为 IntelliJ IDEA

参考:

  1. 在windows10使用Gradle编译Spring源码
    https://blog.csdn.net/qq_34738512/article/details/129747004
  2. 【极速下载】gradle各版本快速下载地址大全
    https://blog.csdn.net/ii950606/article/details/109105402
posted @   mingshan  阅读(141)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示