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.2D:\\Source Code
Java环境JDK 17C:\\Program Files\\Java\\jdk-17
编译工具Gradle 7.6D:\\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即可

  • 新加一个17的系统变量

  • 将原来JAVA_HOME的变量名的值更改如下,进行Java版本切换

  • 然后编辑系统变量Path,配置好下图的A处,同时需要保证B处的这两个变量下移在A的下方(环境变量读取默认由上而下,下移避免系统读取到默认Java版本),配置完毕后,一直确认即可。

check下配置好没有:java-version

三、安装Gradle

1. 下载Gradle

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源码

# 将远程项目镜像拉到本地
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环境设置

  • File → Settings → Build,Execution,Deployment → Build Tools → Gradle

  • build.gradle

找到 repositories 配置节点,新增阿里云镜像仓库地址

maven  url "https://maven.aliyun.com/repository/public"  // 阿里云镜像仓库

  • settings.gradle
    找到 repositories 配置节点,新增阿里云镜像仓库地址
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-corespring-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源码的完整编译过程


由于此次编译的是spring5,jdk版本不能太低


2、下载spring源码


spring源码托管在github上:https://github.com/spring-projects/spring-framework(还没安装git的同学是时候学习一下了,不过此次编译可以不依赖git)


记一次spring5源码的完整编译过程


下载下来解压:


记一次spring5源码的完整编译过程


3、安装gradle(一款基于Groovy的构建工具,比maven更简洁)


传送门:https://gradle.org/releases/


选择4.7版本下载


设置环境变量:


新建用户变量GRADLE_HOME,值为gradle的安装目录,我的安装目录如下:


记一次spring5源码的完整编译过程


设置环境变量:


记一次spring5源码的完整编译过程


检测gradle是否安装成功:


记一次spring5源码的完整编译过程


出现上图说明安装成功


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了


记一次spring5源码的完整编译过程


先导入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


记一次spring5源码的完整编译过程


我已经改好了,注意这里不要想当然的选下面的Switch to试图切换编译版本,本人亲测行不通,不过可以用下面的方式:


Help->Install New Software


记一次spring5源码的完整编译过程


找到安装的groovy的插件(我的已经删了卸载了2.6和2.4版本的了):


记一次spring5源码的完整编译过程


原本有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 源码编译教程分享~的主要内容,如果未能解决你的问题,请参考以下文章

记一次spring5源码的完整编译过程

编译Spring5.2.0源码

Spring-framework5.0.X源码的编译与运行

一步一步构建Spring5源码

学习spring源码-可参考的资料

02. spring源码编译