【spring专题】编译spring5.3源码

文章目录
  • [1. 环境配置](#1. 环境配置)
  • [2. 拉取代码](#2. 拉取代码)
    • 2.1克隆到gitee
    • [2.2 下载到本地](#2.2 下载到本地)
    • [2.3 切换分支](#2.3 切换分支)
    • [2.4 重新导入](#2.4 重新导入)
  • [3. 环境配置](#3. 环境配置)
    • [3.1 安装gradle-方法1](#3.1 安装gradle-方法1)
    • [3.2 安装gradle-方法2(推荐)](#3.2 安装gradle-方法2(推荐))
    • [3.3 jdk安装aspectj](#3.3 jdk安装aspectj)
    • [3.4 idea安装AspectJ插件](#3.4 idea安装AspectJ插件)
  • [4. 项目配置](#4. 项目配置)
    • [4.1 修改build.gradle](#4.1 修改build.gradle)
    • [4.2 修改buildSrcuild.gradle](#4.2 修改buildSrcuild.gradle)
    • [4.3 修改gradlejvm参数(可选)](#4.3 修改gradlejvm参数(可选))
  • [5 配置和构建](#5 配置和构建)
    • [5.1 配置jdk](#5.1 配置jdk)
    • [5.2 配置gradle](#5.2 配置gradle)
    • [5.3 配置aspectj](#5.3 配置aspectj)
    • [5.4 构建](#5.4 构建)
  • [6 编译](#6 编译)
    • [6.1 设置modules](#6.1 设置modules)
    • [6.2 编译子项目](#6.2 编译子项目)
    • [6.3 编译整个项目](#6.3 编译整个项目)
    • [6.4 可能的编译异常](#6.4 可能的编译异常)
      • [6.4.1 内存不足](#6.4.1 内存不足)
      • [6.4.2 https校验异常](#6.4.2 https校验异常)
  • [7 简单测试](#7 简单测试)
    • [7.1 新建模块](#7.1 新建模块)
    • [7.2 引入依赖](#7.2 引入依赖)
    • [7.3 编写代码](#7.3 编写代码)
    • [7.4 运行](#7.4 运行)
  • [8 mvc例子](#8 mvc例子)
    • [8.1 新建模块](#8.1 新建模块)
    • [8.2 配置](#8.2 配置)
      • [8.2.1 修改build.gradle](#8.2.1 修改build.gradle)
      • [8.2.2 spring配置文件](#8.2.2 spring配置文件)
    • [8.3 配置tomcat](#8.3 配置tomcat)
    • [8.4 启动tomcat测试](#8.4 启动tomcat测试)

1. 环境配置

  • jdk版本:1.8.0_301
  • idea版本:2021.2.2
  • 系统版本:win10_64位

2. 拉取代码

2.1克隆到gitee

spring的github地址:https://github.com/spring-projects/spring-framework

git: https://github.com/spring-projects/spring-framework.git

下载比较慢,可以先克隆到gitee,再从gitee获取下载地址

导入成功后,复制我们自己的下载地址

如果不使用ssh下载到本地,后续运行会有git的错误信息(但是不影响运行)

2.2 下载到本地

使用idea克隆到本地,我下载到的目录是H盘的spring目录

2.3 切换分支

完成后选择5.3.x分支,checkout到本地

完成后是这样的,关闭当前项目,并移除

2.4 重新导入

选择源码根目录的build.gradle重新导入

导入后停止构建!!!
导入后停止构建!!!
导入后停止构建!!!

还需要做后续的操作才能构建

3. 环境配置

3.1 安装gradle-方法1

找到本地的文件 H:springgradlewrappergradle-wrapper.properties

打开可以看到5.3.x使用的gradle版本是 gradle-7.5.1-bin.zip

到官网 https://gradle.org/releases/ 找到我们需要的版本

我只需下载 binary-only:https://gradle.org/next-steps/version=7.5.1\&format=bin

解压后配合环境变量 GRADLE_HOME D:gradle-7.5.1

然后在环境变量path添加 %GRADLE_HOME%in

配置仓库 GRADLE_USER_HOME H:gradle_repository

检查

cmd输入 gradle -v

配置文件

在gradle的init.d目录下新建文件 init.gradle,填入下面的内容

复制代码
// project
allprojects{
    repositories {
        mavenLocal()
        maven { url 'https://maven.aliyun.com/repository/central/' }
        maven { url 'https://maven.aliyun.com/repository/public/' }
        maven { url 'https://maven.aliyun.com/repository/google/' }
        maven { url 'https://maven.aliyun.com/repository/gradle-plugin/' }
        maven { url 'https://maven.aliyun.com/repository/spring/' }
        maven { url 'https://maven.aliyun.com/repository/spring-plugin/' }
        maven { url 'https://maven.aliyun.com/repository/grails-core/' }
        maven { url 'https://maven.aliyun.com/repository/apache-snapshots/' }
        maven { url 'https://jitpack.io/' }
        mavenLocal()
        mavenCentral()
    }
}
// plugin
settingsEvaluated { settings ->
    settings.pluginManagement {
        // Clear repositories collection
        repositories.clear()
        // Add my Artifactory mirror
        repositories {
            mavenLocal()
            maven {
                url 'https://maven.aliyun.com/repository/gradle-plugin/'
            }
        }
    }
}

3.2 安装gradle-方法2(推荐)

将下载后的文件放在目录,例如我的是 G:in_repogradlegradle-7.5.1-bin.zip

打开工程的文件 gradlewrappergradle-wrapper.properties

原来的配置

复制代码
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-7.5.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

将distributionUrl修改为
distributionUrl=file:///G:/bin_repo/gradle/gradle-7.5.1-bin.zip

然后找到右侧的gradle刷新按钮点击刷新

同时,idea的gradle配置成 gradle-wrapper.properties

3.3 jdk安装aspectj

下载地址:https://www.eclipse.org/aspectj/downloads.php

下载后使用java -jar运行安装

点击next

选择安装目录,然后next

选择aspectj要安装的目录,我就安装在我的jdk目录下,后面配置idea需要用到该目录

然后点击install执行安装

安装成功

去到安装目录,可以看到已经安装成功

lib下的aspectjtools.jar文件后面idea需要配置到,可以先记下

3.4 idea安装AspectJ插件

打开idea -> plusins安装AspectJ插件

4. 项目配置

4.1 修改build.gradle

项目跟目录下的build.gradle文件

找到(大概是290行左右)

复制代码
repositories {
    mavenCentral()
 maven { url "https://repo.spring.io/libs-spring-framework-build" }
}

修改成

复制代码
repositories {
   mavenLocal()
   maven { url 'https://maven.aliyun.com/repository/public/' }
   maven { url 'https://maven.aliyun.com/repository/central' }
   maven { url 'https://maven.aliyun.com/repository/google/' }
   maven { url 'https://maven.aliyun.com/repository/gradle-plugin/' }
   maven { url 'https://maven.aliyun.com/repository/spring' }
   maven { url 'https://maven.aliyun.com/repository/spring-plugin' }
   maven { url 'https://jitpack.io/' }
   mavenCentral()
   maven { url "https://repo.spring.io/libs-spring-framework-build" }
}

4.2 修改buildSrcuild.gradle

打开项目的 buildSrcuild.gradle

找到

复制代码
repositories {
    mavenCentral()
    gradlePluginPortal()
}

修改成

复制代码
repositories {
   mavenLocal()
   maven { url 'https://maven.aliyun.com/repository/public/' }
   maven { url 'https://maven.aliyun.com/repository/central' }
   maven { url 'https://maven.aliyun.com/repository/google/' }
   maven { url 'https://maven.aliyun.com/repository/gradle-plugin/' }
   maven { url 'https://maven.aliyun.com/repository/spring' }
   maven { url 'https://maven.aliyun.com/repository/spring-plugin' }
   maven { url 'https://jitpack.io/' }
   mavenCentral()
   gradlePluginPortal()
}

4.3 修改gradlejvm参数(可选)

项目根目录下的 gradle.properties 文件

复制代码
version=5.3.26-SNAPSHOT
org.gradle.jvmargs=-Xms2048m -Xmx2048m -XX:MaxPermSize=2048m
org.gradle.caching=true
org.gradle.parallel=true
kotlin.stdlib.default.dependency=false

5 配置和构建

5.1 配置jdk

打开file -> Project Structure

选择jdk8,然后点击右下角apply应用

5.2 配置gradle

打开File -> settings

按照下面的配置好自己的gradle(前面安装gradle方法2的操作)

5.3 配置aspectj

settings -> Build,Execution,Deplotment -> Compile -> Java Compiler

Use compile选择 Ajc

下面的Project bytecode version 选择1.8

Path to aspectjtools.jar就是前面安装插件时提到的lib目录文件 aspectjtools.jar

记得后面红框内的必须勾选 Generate debug indoDelegate to javac

配置好后勾选apply应用

5.4 构建

点击刷新按钮 reload all gradle projects

如果构建过程有超时异常,重复上述操作就好了

成功后

6 编译

6.1 设置modules

file -> Project Structure 找到modules

设置前是结构是这样的

选择项目spring-aop右击

右击添加AspectJ

spring-aspects也一样操作,做完后目录是这样的

6.2 编译子项目

gradle -> spring-oxm -> Tasks -> other -> compileTestJava

编译成功后

6.3 编译整个项目

gradle -> spring -> Tasks -> build -> build

编译结束后

6.4 可能的编译异常

6.4.1 内存不足

关闭其他程序释放出内存再重新执行build构建

6.4.2 https校验异常

异常信息,可以发现异常是由于spring-web模块使用了http引起的

解决方法

打开根目录下 srccheckstylecheckstyle.xml文件,添加内容

复制代码
<!-- 过滤spring-web https校验 -->
    <module name="BeforeExecutionExclusionFileFilter">
        <property name="fileNamePattern" value="^.*\spring-web\.*$"/>
    </module>

7 简单测试

7.1 新建模块

项目 -> NEW -> Module

选择gradle,然后下一步

填写项目名称

等待idea构建结束,项目根目录下的settings.gradle已经有刚刚创建的myDemo模块了

7.2 引入依赖

打开myDemo目录下的build.gradle文件,添加依赖,完整的内容:

复制代码
description = "Spring Demo"
apply plugin: "kotlin"
group 'org.springframework'
version '5.3.26-SNAPSHOT'

repositories {
    mavenCentral()
}
dependencies {
    api(project(":spring-context"))
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}
test {
    useJUnitPlatform()
}

修改了该文件后,idea 右上角有构建按钮,点击构建

如果是引用了

复制代码
plugins {
    id 'java'
}

则不能使用api,应该使用

复制代码
dependencies {
    # 用implementation代替上面的api
    implementation(project(":spring-context"))
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}

7.3 编写代码

User.java

复制代码
package com.demo;

import org.springframework.stereotype.Component;

@Component
public class User {
   public void printName() {
      System.out.println("Spring Demo");
   }
}

MyConfig.java

复制代码
package com.demo;

import org.springframework.context.annotation.ComponentScan;

@ComponentScan(value = "com.demo")
public class MyConfig {
}

Test.java

复制代码
package com.demo;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {
   public static void main(String[] args) {
      AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig.class);
      User user = (User) applicationContext.getBean("user");
      user.printName();
   }
}

完整的目录结构

7.4 运行

运行Test的main方法可以看到控制台已经打印出User返回的内容

8 mvc例子

8.1 新建模块

项目右击 --> new --> Module

gradle --> 勾选java和web

填写项目名称和路径,然后点击finish等待构建完成

构建完成后的目录

8.2 配置

8.2.1 修改build.gradle

添加mvc的依赖

复制代码
api(project(":spring-webmvc"))

完整的内容,修改后点击构建按钮

复制代码
plugins {
    id 'war'
    id 'java'
}
apply plugin: "kotlin"
group 'org.springframework'
version '5.3.26-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    api(project(":spring-webmvc"))
    testImplementation 'junit:junit:4.11'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}

test {
    useJUnitPlatform()
}
8.2.2 spring配置文件
  1. 在webapp下创建创建WEB-INF目录,然后在WEB-INF目录下创建web.xml

    web.xml的内容:

    <?xml version="1.0" encoding="UTF-8"?>

    复制代码
      <display-name>Archetype Created Web Application</display-name>
      <servlet>
         <servlet-name>dispatcher</servlet-name>
         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
         <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring.xml</param-value>
         </init-param>
      </servlet>
      <servlet-mapping>
         <servlet-name>dispatcher</servlet-name>
         <url-pattern>/</url-pattern>
      </servlet-mapping>
  2. 在WEB-INF目录下创建spring.xml

    spring.xml的内容:

    <?xml version="1.0" encoding="UTF-8"?>

    <mvc:annotation-driven />

    <context:component-scan base-package="com.demo"/>

  3. 创建controller

    在java下创建包名 com.demo

    创建 TestController.java

    package com.demo;

    import org.springframework.web.bind.annotation.RequestMapping;

    import org.springframework.web.bind.annotation.RestController;

    @RestController

    public class TestController {

    @RequestMapping(value = "test")

    public String test() {

    return "hello mvc";

    }

    }

完成的目录

8.3 配置tomcat

添加本地的tomcat

选择部署的war包

选择 Deployment --> Artifact

选择我们的war,这里随便哪个都行,下面的那个支持debug时热部署

修改下面的项目名称,我修改成mvc

8.4 启动tomcat测试

启动成功

测试访问

浏览输入访问地址 http://localhost:8080/mvc/test 能正常出来我们返回的内容

相关推荐
葫芦和十三29 分钟前
图解 MongoDB 21|选举与 failover:Primary 是怎么选出来的
后端·mongodb·agent
GetcharZp1 小时前
26k Star 开源内网穿透神器 NetBird,一分钟实现全球设备互联!
后端
考虑考虑2 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯2 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
lizhongxuan5 小时前
多Agent之间的区别
后端
青石路6 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
杨充7 小时前
1.面向对象设计思想
后端
IT_陈寒7 小时前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
systemPro7 小时前
2.6亿条设备数据,历史查询从超时到50ms,我做了什么
后端
要阿尔卑斯吗8 小时前
提示词优化启示:为什么“按顺序输出“比“关键度评分“更有效
后端