【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 能正常出来我们返回的内容

相关推荐
seven97_top1 小时前
SpringCloud 常见面试题(一)
后端·spring·spring cloud
q***12531 小时前
Plugin ‘org.springframework.bootspring-boot-maven-plugin‘ not found(已解决)
java·前端·maven
k***12171 小时前
基于SpringBoot和PostGIS的云南与缅甸的千里边境线实战
java·spring boot·spring
a***11351 小时前
【springboot】健康检查 监控
java·spring boot·后端
q***78781 小时前
创建Spring Initializr项目
java·后端·spring
Peter(阿斯拉)1 小时前
[Java性能优化]_[容器创建枚举去重的最优方法]
java·集合·hashmap·hashset·treemap
小兔崽子去哪了1 小时前
logback 配置文件
java·后端
q***13612 小时前
史上最厉害的Java进阶之路
java·开发语言
q***38512 小时前
Spring Boot + Spring AI快速体验
人工智能·spring boot·spring