前言:Spring Boot 3 RELEASE版本于 2022年11月24日 正式发布,此次Spring Boot里程碑的升级也要求了最低JDK 17 和 Spring Framework 6 ,其核心框架的 Spring 也在 2022年11月16日 迎来了从 5.3.x 到 6.0.x 重大版本升级,借着这个机会,写一篇关于 Spring 6 源码编译的教程分享。
一、环境声明
Spring源码编译官方文档:https://github.com/spring-projects/spring-framework/wiki/Build-from-Source
根据官方描述,Spring 6
需要JDK 17
基础环境 | 版本 | 本地路径 |
---|---|---|
操作系统 | win 10 | - |
spring源码 | 6.0.2 | D:\Source Code |
Java环境 | JDK 17 | C:\Program Files\Java\jdk-17 |
编译工具 | Gradle 7.6 | D:\Develop Software\gradle-7.6 |
开发工具 | 2021.3.2 | - |
二、安装JDK 17
1. 下载JDK17
下载链接: https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe
下载后静默安装即可,按需修改 JDK 路径(我是放在C:\Program Files\Java\jdk-17下)
2.配置环境变量
根据自己情况配置,如果本地的JDK版本不是17则需要配置,是JDK 17的忽略!
考虑到可能会涉及到原来是JDK 8的用户,则需要多配置个JDK 17即可
check下配置好没有:java-version
三、安装Gradle
1. 下载Gradle
-
下载地址:https://gradle.org/releases
-
下载解压到指定目录(我的是 D:\Develop Software\gradle-7.6)
2.配置环境变量
添加系统变量:GRADLE_HOME=D:\Develop Software\gradle-7.6
添加至Path路径(%GRADLE_HOME%\bin),然后一直确认即可。
查看版本 gradle -v
3.配置镜像仓库
在gradle安装位置(D:\Develop Software\gradle-7.6\init.d) 目录下新建 init.gradle 文件
参考阿里云官方gradle配置指南:https://developer.aliyun.com/mvn/guide ,init.gradle 完整内容如下:
allprojects {
repositories {
maven {
url 'file:///D:/Develop Software/maven/repository'} // 本地仓库地址,如果没有依次向下寻找
maven {
url "https://maven.aliyun.com/repository/public" }
mavenLocal()
mavenCentral()
}
buildscript {
repositories {
maven {
url 'https://maven.aliyun.com/repository/public' }
mavenLocal()
mavenCentral()
}
}
}
四、源码编译
1.获取Spring源码
- 可以去GitHub下载 https://github.com/spring-projects/spring-framework.git(速度可能比较慢)
- 我这里直接在GitCode上下载https://gitcode.net/mirrors/spring-projects/spring-framework.git,直接通过命令拉取即可
git clone [email protected]:mirrors/spring-projects/spring-framework.git
- 用IDEA打开拉取好的源码,选择稳定版本v6.0.2 ,所以还需要进行分支切换:
# 将远程项目镜像拉到本地
git remote add spring [email protected]:mirrors/spring-projects/spring-framework.git
# 切换分支
git checkout -b v6.0.2
# 拉取分支到本地
git pull origin v6.0.2
2.IDEA环境设置
找到 repositories
配置节点,新增阿里云镜像仓库地址
maven {
url "https://maven.aliyun.com/repository/public" } // 阿里云镜像仓库
maven {
url "https://maven.aliyun.com/repository/public" } // 阿里云镜像仓库
-
gradle.properties
项目内gradle.properties
配置文件添加java路径
org.gradle.java.home=C:\\Program Files\\Java\\jdk-17
-
慢慢等待gradle拉取相关依赖
- 注意拉取依赖过程中可能出现类似这样的报错:说没有找到相关的jar,这时需要我们去maven官网搜索相关版本的jar包,下载下来扔进提示中的目录中即可
- 同时还可能发生类似这样的报错:没找到对应的方法
这可能是由于没有切换Spring分支导致的,使用的还是Spring 5.x分支版本的代码,而Gradle 7更改了相应的方法名,导致找不到方法报错!
解决方案:
方案1:Spring版本切换成 6.x;
方案2:可以用Gradle官网给的方法更新对应表,进行对应替换即可
-
拉取完毕后这样就表示OK了
3.编译步骤
在完成上述的源码导入和相关设置之后,就可以进行源码编译了。
参考IDEA导入说明文档 import-into-idea.md ,仅需三步:
1. Precompile spring-oxm
with ./gradlew :spring-oxm:compileTestJava
在IDEA的Terminal终端中输入 ./gradlew :spring-oxm:compileTestJava
先执行 spring-oxm 的预编译:
done:
2.Import into IntelliJ (File -> New -> Project from Existing Sources -> Navigate to directory -> Select build.gradle)
- File → New → Project from Existing Sources → Select File or Directory to import 选择
build.gradle
点击 OK 完成编译
3.When prompted exclude the spring-aspects
module (or after the import via File-> Project Structure -> Modules)
五、测试案例
在完成上文 Spring 源码编译之后,接下来我们可以新增一个示例模块来依赖工程中的其它 spring 模块做个简单的测试。
1.新建模块
File → Module 新增 spring-mytest-sample 示例模块
2.添加依赖
在 spring-mytest-sample
模块下的 build.gradle
新增 spring-context
依赖,它是包含了 spring-core
、 spring-bean
和 IoC容器等Spring 运行时上下文的依赖。
3.测试代码
代码结构如下:
/**
* 车接口
*/
public interface CarService {
// 获取车的颜色
String getColor();
// 获取车的品牌
String getBrand();
}
/**
* 奔驰
*/
@Service
@Primary // 当一个接口存在多个实现类时,通过@Primary注解来指明哪个实现类作为首选进行自动装配注入
public class BenzCarServiceImpl implements CarService {
@Override
public String getColor() {
return "Color: black";
}
@Override
public String getBrand() {
return "Brand: Benz";
}
}
/**
* 保时捷
*/
@Service
public class PorscheCarServiceImpl implements CarService {
@Override
public String getColor() {
return "Color: pink";
}
@Override
public String getBrand() {
return "Brand: Porsche";
}
}
/**
* 启动测试类
*/
@ComponentScan("com.spring.mytest.sample.**")
public class SpringMyTestSampleApplication {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
SpringMyTestSampleApplication.class
);
CarService carService = context.getBean(CarService.class);
System.out.println(carService.getColor());
System.out.println(carService.getBrand());
}
}