Spring 6 源码编译教程分享~
Posted 1 Byte
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 6 源码编译教程分享~相关的知识,希望对你有一定的参考价值。
前言: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 git@gitcode.net:mirrors/spring-projects/spring-framework.git
- 用IDEA打开拉取好的源码,选择稳定版本v6.0.2 ,所以还需要进行分支切换:
# 将远程项目镜像拉到本地
git remote add spring git@gitcode.net: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());
4.测试结果
完美收官! end…
记一次spring5源码的完整编译过程
学习java已有3年之久,spring一直停留在应用阶段,两次面试阿里的经历让我深感学习spring源码的重要性,废话不多说,开搞!
1、环境:
jdk1.8+spring5+gradle4.7+eclipse4.6
如果要参考该教程,环境最好一样(eclipse除外),因为以前编译过spring3,由于环境问题折腾了好久。
2、检测jdk版本java -version
由于此次编译的是spring5,jdk版本不能太低
2、下载spring源码
spring源码托管在github上:https://github.com/spring-projects/spring-framework(还没安装git的同学是时候学习一下了,不过此次编译可以不依赖git)
下载下来解压:
3、安装gradle(一款基于Groovy的构建工具,比maven更简洁)
传送门:https://gradle.org/releases/
选择4.7版本下载
设置环境变量:
新建用户变量GRADLE_HOME,值为gradle的安装目录,我的安装目录如下:
设置环境变量:
检测gradle是否安装成功:
出现上图说明安装成功
4、将spring工程转换成eclipse可识别的工程
进入spring的解压目录,执行下面命令:
gradle cleanidea eclipse
(网上普遍反应这个步骤会报错,反正我是一次通过,以前编译spring3的时候在这里的确折腾了很久)
此时直接导入eclipse spring-core工程会报错缺少jar包:spring-cglib-repack-x.x.x.jar、spring-objenesis-repack-x.x.jar
要在spring的解压目录下执行下面这两个命令:
gradle objenesisRepackJar
gradle cglibRepackJar
5.此时你可以把spring工程导入到eclipse了
先导入spring-jcl,不然spring-core会报错(这些工程之间的依赖关系自己去摸索吧)
6、解决spring-bean工程的代码报错
缺少groovy插件,
安装groovy插件:
在eclipse的 Help -> Install New Software 中,添加groovy的下载连接:
http://dist.springsource.org/snapshot/GRECLIPSE/e4.6/(这里最后的e4.6代表你eclipse的版本别搞错了,不然安装不成功别找我)
这个安装groovy插件话说有点坑,开了vpn速度也提不上去,哪位老铁有好的方法烦请告知一声哈
7、安装groovy插件后会报一个groovy编译版本的错误,spring5用的是2.5的编译版本,而我们下载的groovy默认是2.6版本,查看groovy编译版本方式:windows->perferences->groovy
我已经改好了,注意这里不要想当然的选下面的Switch to试图切换编译版本,本人亲测行不通,不过可以用下面的方式:
Help->Install New Software
找到安装的groovy的插件(我的已经删了卸载了2.6和2.4版本的了):
原本有2.4、2.5和2.6三个编译版本,我们把2.4和2.6的给卸载了(选中2.4和2.6点击下面的Uninstall按钮),然后重启eclipse
8、解决spring-oxm报错问题(缺少castor和jax)
在spring的解压目录下执行下面命令
1.gradle genCastor
2.gradle genJaxb
然后去spring-oxm/build/classes下面看看,如果已生成jar包则应该不会再报错(记得clean一下)
不过我这里有些奇怪,执行上面两条命令后竟然生成的是解压后的文件,如果你也一样的话,还要继续以下步骤:
在classes目录下分别执行下面两条命令(自己打jar包):
jar cvf jaxb.jar jaxborg
jar cvf castor.jar castororg
然后回到eclipse,右键spring-oxm->build Path:
在Libraries中把原本的castor和jaxb删除,然后再重新导入我们手动打的jar包
到此为止,spring5的源码导入算是成功了:
出处:csdn.net/coder_no/article/details/83315981
点个“在看”哦!
以上是关于Spring 6 源码编译教程分享~的主要内容,如果未能解决你的问题,请参考以下文章