废话少说,直接进入正题!
一、下载及预编译
首先git clone源码到本地:
https://github.com/spring-projects/spring-framework.git
代码clone到本地之后进入到文件件中cd spring-framework
,这个时候需要关注import-into-idea.md
这个文件,这是用idea编译源码的说明文件。根据里面的说明,在编译整个源码前需要预先编译spring-oxm
和spring-core
这两个模块,依次运行命令./gradlew :spring-core:compileTestJava
和./gradlew :spring-oxm:compileTestJava
。编译过程如下,当然首先是安装好gradle:
$ ./gradlew :spring-oxm:compileTestJava
Welcome to Gradle 6.7.1!
Here are the highlights of this release:
- File system watching is ready for production use
- Declare the version of Java your build requires
- Java 15 support
For more details see https://docs.gradle.org/6.7.1/release-notes.html
Starting a Gradle Daemon, 1 busy Daemon could not be reused, use --status for details
> Task :spring-oxm:genJaxb
[ant:javac] : warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.7.1/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 37s
40 actionable tasks: 24 executed, 16 from cache
# pengchengbai @ Pengcheng-Bai in ~/IdeaProjects/spring-framework on git:master o [11:42:36]
$ ./gradlew :spring-core:compileTestJava
Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.7.1/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 7s
17 actionable tasks: 2 from cache, 15 up-to-date
二、导入Idea并编译
使用Idea导入源码:File -> New -> Project from Existing Souces…然后选择我们的
spring-framework
目录就行了 注意这里是选择New 而不是Open;然后在Import Project 面板中选择gradle,点击Finish;
可以发现IDEA会自动开始构建编译spring源码。
三、验证
编译好源码之后怎么验证构建和编译是否成功呢?我们可以自己写一段代码,然后依赖我们构建的源码,如果能够正常运行,则说明构建成功。
在spring-framework项目下新建一个module,在新建的时候gradle构建(当然maven也可以,这里只是为了跟源码保持统一),然后Module SDK选择Java8;
然后在路径
src/main/java
中创建包和源代码,我这里创建了一个配置类:
package site.pengcheng;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* @author pengchengbai
* @description
* @date 2020/12/18 11:50 上午
*/
@Configuration
@ComponentScan("site.pengcheng")
public class AppConfig {
}
然后再创建一个普通的spring Bean
:
package site.pengcheng.pojo;
import org.springframework.stereotype.Component;
/**
* @author pengchengbai
* @description
* @date 2020/12/18 11:51 上午
*/
@Component
public class Hello {
public void hello(){
System.out.println("Hello, world");
}
}
最后创建一个测试类:
package site.pengcheng;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import site.pengcheng.pojo.Hello;
/**
* @author pengchengbai
* @description
* @date 2020/12/18 11:52 上午
*/
public class TestHello {
public static void main(String[] args) {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
Hello bean = ac.getBean(Hello.class);
bean.hello();
}
}
这里使用AnnotationConfigApplicationContext
作为spring上线文去获取bean,并运行bean中的方法。运行main方法,如果输出如下信息则表示成功:
3:04:34 下午: Executing task 'TestHello.main()'...
Starting Gradle Daemon...
Gradle Daemon started in 1 s 577 ms
> Task :buildSrc:compileJava UP-TO-DATE
> Task :buildSrc:compileGroovy NO-SOURCE
> Task :buildSrc:pluginDescriptors UP-TO-DATE
...// 省略
> Task :spring-context:jar UP-TO-DATE
> Task :spring-study:compileJava
> Task :spring-study:classes
> Task :spring-study:TestHello.main()
Hello, world
Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.7.1/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 16s
35 actionable tasks: 2 executed, 33 up-to-date
3:04:51 下午: Task execution finished 'TestHello.main()'.
- 最后就可以在spring的源码海洋中恣意畅游啦!
四、后记
在这个过程中可能会遇到各种各样的报错,要么是idea版本问题,要么是gradle版本问题,要么是kotlin版本问题,还有的报错根本不知道什么问题。我这里只是记录了成功编译的那次的情况,仅做参考,遇到具体的问题还得具体解决,如果不想知道错误原因就卸载、删除、推翻重来!总会成功的!