spring源码5.2.x环境搭建

  • 1.拉取git代码
  • 2.配置gradle
  • 3.配置Gradle环境变量
  • 4.使用Idea,直接open选中源码项目打开
  • 5.打开build.gradle文件,在文件头部加上Spring插件库
  • 6.bulid.gradle文件添加阿里镜像
  • 7.等待下载依赖
  • 8.查看是否构建成功
  • 9.spring-aspects模块问题解决
  • 9.1下载AspectJ编译器
  • 9.2idea安装Aspectj插件
  • 9.3 将Idea编译器设置为ajc
  • 9.4 spring-aop_main和spring-aspectjs_main 添加aspectj
  • 10.编译
  • 11.测试基本功能
  • 12.测试aspectj
  • 13.控制台乱码问题解决


1.拉取git代码

git clone -b 5.2.x https://github.com/spring-projects/spring-framework.git

如果网络不好,可以通过gitee把github上的spring-framework导入到gitee

2.配置gradle

下载gradle到e:/gradle目录并解压到当前目录

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

使用文本编辑器查看项目目录spring-framework\gradle\wrapper\gradle-wrapper.properties文件

进行如下操作
注释掉一行,添加一行

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
#distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip
distributionUrl=file:///e:/gradle/gradle-5.6.3-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

3.配置Gradle环境变量

新增系统变量

Spring框架的搭建_spring

Path变量添加一条

%GRADLE_HOME%\bin

4.使用Idea,直接open选中源码项目打开

注意打开Idea应该会自动加载,全部点取消

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

Spring框架的搭建_Spring框架的搭建_02

5.打开build.gradle文件,在文件头部加上Spring插件库

(这个就相当于是maven的pom文件),

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

Spring框架的搭建_spring_03

网上的基本都是

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

网上的可能会报如下错误

org.org.gradle.internal.resource.transport.http.HttpErrorStatusCodeException: Could not HEAD 'https://repo.spring.io/xxxx/.../xxx.pom'. Received status code 401 from server: Unauthorized

就是禁止匿名访问

Spring框架的搭建_maven_04

6.bulid.gradle文件添加阿里镜像

搜索repo

Spring框架的搭建_Spring框架的搭建_05

maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }

maven { url "https://repo.springsource.org/plugins-release" }

7.等待下载依赖

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

Spring框架的搭建_spring_06

8.查看是否构建成功

构建成功之后,找到 ApplicationContext 类,打开后,按下Ctrl+Alt+U键,如果出现下图所示类图界面说明构建成功了

Spring框架的搭建_maven_07

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

9.spring-aspects模块问题解决

一般情况下在编译spring源码时,spring-aspects模块是不能和其它模块(spring-core等)在导入IDEA时一起编译的,因为它依赖了aspectJ

因此要解决,网上的博客要么直接在项目中排除spring-aspects模块,即不编译spring-aspects,要么就是如下方式解决

9.1下载AspectJ编译器

去AspectJ官网下载AspectJ编译器,下载aspectj1.9.5的。

选择一个国内镜像

Spring框架的搭建_User_08

下载好了后cmd切换到下载的目录下,执行java -jar aspectj-1.9.5.jar 命令安装ajc编译器。选择jdk目录

Spring框架的搭建_User_09

9.2idea安装Aspectj插件

请注意

网上的很多教程安装的插件是两个,Spring AOP/@AspectJ和AspectJ Support

但是现在这两个都搜不到了,只有AspectJ,猜测应该是把上面两个融合在一起了

Spring框架的搭建_User_10

9.3 将Idea编译器设置为ajc

将Idea编译器设置为ajc,然后设置AspectJ安装目录下的lib文件夹中的aspectjtools.jar文件,再勾选Delegate to Javac选项。

Spring框架的搭建_maven_11

9.4 spring-aop_main和spring-aspectjs_main 添加aspectj

将 spring-aop_main 和 spring-aspectjs_main 两个模块添加 AspectJ Facets,打开:File–Project Structure–Modules

Spring框架的搭建_maven_12

**spring-aspectjs_main同样操作。**别忘了

10.编译

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

Spring框架的搭建_spring_13

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

Spring框架的搭建_maven_14

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

Spring框架的搭建_maven_15

编译完后,如果有一些用不到的模块编译失败,不用管它,例如spring-webflux

11.测试基本功能

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

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

Spring框架的搭建_Spring框架的搭建_16

Spring框架的搭建_User_17

  1. 找到我们自己的测试模块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'
}
  1. 下面编写一个简单的applicationContext获取容器用的bean,主要是测试Spring源码构建编译过程是否成功!

建立实体类User.java

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

@Configuration
@ComponentScan
public class JavaConfig {
	@Bean
	public User user(){
		return new User("001","Jack");
	}
}

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

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());
	}

}

运行Test类

Spring框架的搭建_spring_18

表明环境已经成功了

12.测试aspectj

test项目的build.gradle添加aspectj依赖

Spring框架的搭建_User_19

添加完成后记得构建一下test项目,那个刷新图标刷新一下

新建如下两个类

@Component
public class TargetObj {
	public void saySomething() {
		System.out.println("调用。。。。");
	}
}
@Component
@EnableAspectJAutoProxy
@Aspect
public class MyAspect {

	@Pointcut("execution(* com.wly.TargetObj.*(..))")
	public void basePoint() {

	}

	@Before("basePoint()")
	public void hsf(JoinPoint joinPoint) {
		String name = joinPoint.getSignature().getName();
		System.out.println("methodName="+name);
	}
}

修改Test类代码测试aspectj

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());*/

		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);
		TargetObj targetObj = context.getBean("targetObj", TargetObj.class);
		targetObj.saySomething();

	}
}

运行Test

发现出现控制台乱码

13.控制台乱码问题解决

  1. 修改 IntelliJ IDEA 全局编码、项目编码、属性文件编码

Spring框架的搭建_User_20

  1. IDEA 中自定义虚拟机选项:Help→Etit Custom VM Options

Spring框架的搭建_Spring框架的搭建_21

3.在test项目中的build.gradle里加个设置,要求编码用UTF-8

tasks.withType(JavaCompile) { 
  options.encoding = "UTF-8" 
}

Spring框架的搭建_maven_22

  1. 同时也在Gradle RunConfigurations 中 添加虚拟机参数配置UTF-8

Spring框架的搭建_maven_23

  1. 在IDEA 中 编辑 Help | Edit Custom VM Options ,加入下面的参数
-Dfile.encoding=UTF-8

Spring框架的搭建_Spring框架的搭建_24

完成上面几步后,关闭IDEA,再打开,再运行Test类的main方法

Spring框架的搭建_Spring框架的搭建_25

至此解决。

网上 大多数都都是这几步,有的还加下面这步,如果上面的方法都没有解决可试试下面这步

setting>gradle>build and run using项 默认的是gradle,改选idea项,但是我这样弄,编译都报错

Spring框架的搭建_spring_26

本文章参考并结合了下面文章,太多坑了。