最近想研究下spring的源码,决定先把源码跑起来,在此记录一下本次遇到的问题。
本次使用的工具有:git、IDEA2021社区版、jdk17、gradle7.5.1
从Build from Source得知,需要git和jdk17。然后把java环境变量配置好。
首先获取源码,git clone [email protected]:spring-projects/spring-framework.git,然后打开源码中的import-into-idea.md,会看到
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)
Code away
那就按照官方说的做咯,然后运行./gradlew :spring-oxm:compileTestJava,我发现他一上来先下载gradle,后面就一直卡在3%不动了。于是自己装了个gradle(方式如下),
1.下载gradle:https://downloads.gradle-dn.com/distributions/gradle-7.5.1-bin.zip
2.配置环境变量,变量名:GRADLE_HOME Gradle的解压目录,然后在Path中添加,%GRADLE_HOME%\bin
3.配置仓库地址,环境变量中新增,GRADLE_USER_HOME 自定义Gradle仓库目录
然后把spring源码中的build.gradle和settings.gradle中加入阿里云镜像。
maven {url 'https://maven.aliyun.com/repository/public/'}
这么一通下来,我发现运行./gradlew :spring-oxm:compileTestJava,还是会下载gradle,于是把项目中gradle/wrapper/gradle-wrapper.properties中的distributionUrl注释掉,
不用spring提供的命令,而是使用gradle :spring-oxm:compileTestJava ,这下终于BUILD SUCCESSFUL。
然后把项目导入到idea,并配置Gradle
排除spring-aspects模块
然后等待gradle build完成。
新建一个模块spring-demo,测试下是否成功,卡在这里很久,新建的项目包也引进来了,始终在代码里无法导入依赖,最后发现我建的模块和spring模块中的结构不一致,删了重建后就好了,测试代码如下:
//spring-demo.gradle
plugins {
id 'java'
}
group 'org.springframework'
version '6.0.1-SNAPSHOT'
dependencies {
api(project(":spring-context"))
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}
test {
useJUnitPlatform()
}
测试代码如下:
//JavaConfig.class
@Configuration
public class JavaConfig {
@Bean
public Person person(){
Person p= new Person();
p.setName("yyb");
return p;
}
}
//Person.class
public class Person {
private String name;
public Person(){
System.out.println("2、开始实例化 person ");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//Test.class
ApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);
Person person = (Person) context.getBean("person");
System.out.println("13、实例化完成,此时可获取属性的值:Person name = " + person.getName());
测试结果:
经过一番努力,终于成功了。感谢以下博主的无私分享,不然我也不会这么轻易就成功:
一步步教你使用Gradle编译Spring源码
as4配置本地gradle_gradle+IDEA构建spring源码阅读环境