Spring源码环境搭建--基于Gradle构建

Spring源码环境搭建–基于Gradle构建

在我第一次搭建Spring的源码环境的时候遇到了很多坑,这里写个文档帮助同样想搭建Spring源码环境的同学避坑。
在尝试多次之后,我选择了Spring 5.2.x来进行搭建,Gradle版本这里也建议5.6.3,因为直接选择master分支的话,构建的时候会有很多问题,可能还需要高版本JDK,相信很多同学JDK都是1.8版本的,5.2.x我也是使用的JDK1.8,全程搭建下来也没有什么大问题,大家跟着我一步一步搭建即可。
如果有同学想要编译好,可以直接导入Idea的源码,可以点击打开链接,自行下载。

  1. git

    使用git clone 从GitHub上把源码拉取下来(注意:最好选择使用git从远程拉取下来,不然使用zip包直接下载的话,后面会有小问题)

    命令(注意拉取的时候,要具体选择某一分支,不选择的话,默认拉取的是master分支,如果你也想搭建Spring 5.2.x的话,可以直接使用我下面命令)
    git clone -b 5.2.x https://github.com/spring-projects/spring-framework.git
    
  2. Gradle

    查看拉取项目的Gradle版本,然后下载配置Gradle

    1. 查看项目目录:spring-framework\gradle\wrapper\gradle-wrapper.properties文件
    2. image-20220409100329107

    3.打开https://gradle.org/releases下载对应版本Gradle(Spring 5.2.x 推荐Gradle版本5.6.3)

    4.下面之后配置Gradle环境变量

    image-20220409100755425

    5.Path环境变量里添加一条

    %GRADLE_HOME%\bin
    

    6.配置好之后把原来下载Gradle的那行代码注释掉,重新写上自己下载下来的Gradle zip包,这样可以避免重复下载Gradle包

    distributionBase=GRADLE_USER_HOME
    distributionPath=wrapper/dists
    #distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip
    distributionUrl=file:///d:/Environment/gradle-5.6.3-all.zip
    zipStoreBase=GRADLE_USER_HOME
    zipStorePath=wrapper/dists
    
  3. 使用Idea,直接open选中源码项目打开即可,注意打开Idea应该会自动加载,全部点取消

  4. 打开项目之后,【File】->【Settings】,设置Gradle,Gradle user home这个目录这里我设置的刚 安装的gradle目录。如果不设置的话,它默认是C:\Users\用户名\.gradle,这个目录你就可以认为相当于 是我们的本地的maven仓库,gradle编译项目所依赖的jar都会下载后放入这个目录中。JVM默认我这里就是jdk8,jdk至少就是jdk8。

    image-20220409102213941

    5.打开build.gradle文件(这个就相当于是maven的pom文件),在文件头部加上Spring插件库

    buildscript {
    repositories {
    maven { url "https://repo.spring.io/plugins-release" }
    }
    }
    

    image-20220409102450504

    6.然后往下继续寻找,找到如下代码段,添加对应代码,配置阿里云镜像加速依赖下载,新增Spring插件库

    image-20220409102641220

    //新增以下2个阿里云镜像
    maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
    maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
    
    //新增spring插件库
    maven { url "https://repo.springsource.org/plugins-release" }
    

    7.都修改好之后,保存一下,点击页面下图刷新图标,等待项目下载依赖构建即可,如果有报错多刷新几遍

    image-20220409103026504

    8.如果有报如下错误的,可以把之前添加的spring插件库代码注释掉试一试。

    报错:Could not HEAD 'https://repo.spring.io/plugins-release/io/spring/ge/conventi……
    
    解决办法:把之前添加的下面两段spring插件库代码注释掉试一试
    buildscript {
    repositories {
    maven { url "https://repo.spring.io/plugins-release" }
    }
    }
    
    //新增spring插件库
    maven { url "https://repo.springsource.org/plugins-release" }
    

    9.构建成功之后,找到 ApplicationContext 类,打开后,按下Ctrl+Alt+U键,如果出现下图所示类图界面说明构建成功了!(构建过程就是找依赖对象的过程)

    image-20220409103743033

    此时可以查看Spring的源码了,但是我们需要在源码的基础上面进行修改,开发,调试,添加注释等等 操作,所以需要将源码进行编译打包,下面我们将进行编译源码编译

    10.先编译spring-oxm下的compileTestjava,选中双击即可,编译完成出现BUILD SUCCESSFUL代表编译完成

    image-20220409104007132

    11.保险起见再编译下spring-core模块,因为之后的spring-context依赖于core,方法同上。

    image-20220409104528268

    12.都编译完成且成功之后,最后开始编译整个工程(这个过程非常耗时间),打开顶层项目spring->build->build,双击开始编译

    image-20220409104708571

    13.都编译成功之后,可以添加一个测试模块进来,进行测试源码构建编译是否真的完成

    ​ 步骤:【File】->【New】->【Module…】 在Spring中添加自己的module模块,同样选择gradle构建。

    image-20220409105049197

    image-20220409105148540

    14.找到我们自己的测试模块test,打开build.gradle文件(相当于是pom文件),默认 dependencies依赖(这里的dependencies和maven里的依赖是一样的)我们需要手工添 加spring-context,spring-beans,spring-core,spring-aop这4个核心模块,具体如下:

    dependencies {
    
        //添加完要构建一下,否则代码中无法引用,注意不要忘了
        compile(project(":spring-context"))
        compile(project(":spring-beans"))
        compile(project(":spring-core"))
        compile(project(":spring-aop"))
    
    
        testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
        testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
    }
    

    15.下面编写一个简单的applicationContext获取容器用的bean,主要是测试Spring源码构建编译过程是否成功!

    ​ 建立实体类User.java

    package xl.test;
    
    /**
     * @author Xl
     * @date 2022/4/9 - 0:54
     * @Description:
     */
    public class User {
    	private String id;
    	private String userName;
    
    	public User() {
    	}
    
    	public User(String id, String userName) {
    		this.id = id;
    		this.userName = userName;
    	}
    
    	public String getId() {
    		return id;
    	}
    
    	public void setId(String id) {
    		this.id = id;
    	}
    
    	public String getUserName() {
    		return userName;
    	}
    
    	public void setUserName(String userName) {
    		this.userName = userName;
    	}
    
    	@Override
    	public String toString() {
    		return "User{" +
    				"id='" + id + '\'' +
    				", userName='" + userName + '\'' +
    				'}';
    	}
    }
    

    新建JavaConfig.java  (使用注解的方式声明bean)

    package xl.test;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @author Xl
     * @date 2022/4/9 - 0:55
     * @Description:
     */
    @Configuration
    @ComponentScan
    public class JavaConfig {
    	@Bean
    	public User user(){
    		return new User("001","Jack");
    	}
    }
    

    最后编写一个测试类Test.java

    package xl.test;
    
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    /**
     * @author Xl
     * @date 2022/4/9 - 0:59
     * @Description:
     */
    public class Test {
    	public static void main(String[] args) {
    		System.out.println("hello");
    		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);
    		User user = (User) context.getBean("user");
    		System.out.println(user.toString());
    	}
    
    }
    

    运行结果

    image-20220409111301359

    如果觉得我的文章对你有帮助的话的话就点个赞吧!

  • 13
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值