目录

前言:

1.spring源代码下载地址:

2.安装Gradle:

3.Java 版本:

4.编译源码:

4.1.编译源码:

4.2.转化为eclipse工程:

5.安装eclipse插件:

6.导入到eclipse中:

7.创建测试模块:

1.每个模块中提供了Junit测试代码,可以直接使用,也可以添加或者修改。

2.自己创建测试模块:


前言:

本文在windows10环境下编译

编译Spring源码,一定要参考官方文档,遇到问题之后,再参考其他人的文章。

https://github.com/spring-projects/spring-framework/wiki/Build-from-Source

https://github.com/spring-projects/spring-framework/blob/main/import-into-eclipse.md

1.spring源代码下载地址:

https://github.com/spring-projects/spring-framework, 本文所用版本5.0.x

2.安装Gradle:

Gradle下载地址: https://services.gradle.org/distributions/

gradle版本:

spring源码导入idea怎么构建 spring源码环境搭建调试_spring

下面的仅供参考:

之前编译5.2.x版本的源码,遇到错误,原因是编译spring对gradle的版本是有要求的,我们先看看spring 5.2.x源代码中的信息:

spring源码导入idea怎么构建 spring源码环境搭建调试_spring_02

JMH(jmh-gradle-plugin)的版本是0.6.4, 而JMH跟gradle是有对应关系的,请看https://github.com/melix/jmh-gradle-pluginJMH 0.6.4对应的gradle版本是6.8+。

spring源码导入idea怎么构建 spring源码环境搭建调试_eclipse_03

如果Gradle版本不对,会报各种各样的错误,例如:

1.Only Project build scripts can contain plugins {} blocks

2.This version of the JMH Gradle plugin requires Gradle 6+, .........

等等。

3.Java 版本:

官方文档中要求JDK8 262或者以后的版本都行.

spring源码导入idea怎么构建 spring源码环境搭建调试_spring_04

但是我的JDK版本是201,JRE版本是281,总是出现一些莫名其妙的错误,所以统统将其改为更高版本的291试试。

spring源码导入idea怎么构建 spring源码环境搭建调试_spring源码导入idea怎么构建_05

4.编译源码:

4.1.编译源码:

按照官网的要求执行"gradlew build" 或者直接执行"gradlew.bat"。这个没有碰到过问题,编译成功。

spring源码导入idea怎么构建 spring源码环境搭建调试_spring源码导入idea怎么构建_06

4.2.转化为eclipse工程:

执行"import-into-eclipse.bat", 成功后结果如下:

spring源码导入idea怎么构建 spring源码环境搭建调试_java_07

5.安装eclipse插件:

  • 按照spring源码中的guide,去安装eclipse需要的插件,Kotlin, Groovy, AJDT, TestNG等等。
  • build其中的某个模块,例如spring-oxm
  • 应用特定于项目的设置, “gradlew eclipseBuildship”等等

spring源码导入idea怎么构建 spring源码环境搭建调试_spring_08

查看官方文档,要求将Groovy插件的版本修改为2.5,但是目前使用的Eclipse Luna版本安装插件后,仅仅支持到2.4, 没办法,使用高版本的Eclipse 2020-03 (4.15.0)

spring源码导入idea怎么构建 spring源码环境搭建调试_spring_09

6.导入到eclipse中:

导入的过程中又报错了:

Caused by: org.gradle.api.GradleScriptException: A problem occurred evaluating project ':spring-beans'.
...............................................................
* Where:
Build file 'C:\.......\spring-framework\spring-beans\spring-beans.gradle' line: 28

* What went wrong:
A problem occurred evaluating project ':spring-beans'.
> No such property: immutableValues for class: org.gradle.api.internal.tasks.DefaultTaskDependency

 把spring-beans.gradle文件中最后三行注释掉。

spring源码导入idea怎么构建 spring源码环境搭建调试_eclipse_10

然后就能成功导入了.

spring源码导入idea怎么构建 spring源码环境搭建调试_eclipse_11

7.创建测试模块:

1.每个模块中提供了Junit测试代码,可以直接使用,也可以添加或者修改。

2.自己创建测试模块:

  1. 在spring项目中创建一个子模块的文件夹,例如bruce-test
  2. 在文件夹中添加build.gradle文件, 可以将其名字改成与模块名字一致,bruce-test.gradle
  3. 在spring项目中的settings.gradle中引入子模块,例如在文件中添加 include "bruce-test"
  4. 在spring项目上右键gradle-->refresh
  5. 然后创建src.main.java,src.main.resources, src.test.java等文件夹
  6. 创建包名,添加class文件。

spring源码导入idea怎么构建 spring源码环境搭建调试_java_12

1.Gradle依赖配置bruce-test.gradle:

参考spring-test模块的spring-test.gradle文件。本文目前只测试spring context,即spring 容器相关的功能,所以只配置optional(project(":spring-context")) 即可。

description = "Spring TestContext Framework"

dependencies {
	compile(project(":spring-core"))
	optional(project(":spring-aop"))
	optional(project(":spring-beans"))
	optional(project(":spring-context"))
	optional(project(":spring-jdbc"))
	optional(project(":spring-orm"))
	optional(project(":spring-tx"))
	optional(project(":spring-web"))
	optional(project(":spring-webflux"))
	optional(project(":spring-webmvc"))
	optional(project(":spring-websocket"))

2.Student.java:

package com.bruce;

public class Student {
	private int age;
	private String name;
 
	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}
 
	public void setName(String name) {
		this.name = name;
	}
}

3.ClassRoom.java:

package com.bruce;

public class ClassRoom {
	private Student student;
	 
	public Student getStudent() {
		return student;
	}
 
	public void setStudent(Student student) {
		this.student = student;
	}
}

4.spring容器(上下文)配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
 
	<bean id="classroom" class="com.bruce.ClassRoom">
		<property name="student" ref="student"/>
	</bean>
 
	<bean id="student" class="com.bruce.Student"></bean>
</beans>

5.具体测试类 StudentDemoTest.java:

两种方式:

1.使用main方法测试:

package com.bruce;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class StudentDemoTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ApplicationContext ac = new ClassPathXmlApplicationContext("com/bruce/spring-bruce-test.xml");
		Student student = (Student) ac.getBean("student");
		student.setAge(12);
		student.setName("bruce");
		ClassRoom classroom = (ClassRoom) ac.getBean("classroom");
		System.out.println(classroom);
		System.out.println("Debug:学生年龄" + classroom.getStudent().getAge());
		System.out.println("Debug:学生姓名" + classroom.getStudent().getName());
	}

}

2.使用Junit:

package com.bruce;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class StudentJunitTest {
	@Test
	public void contextTest() {
		ApplicationContext ac = new ClassPathXmlApplicationContext("spring-bruce-test.xml");
		Student student = (Student) ac.getBean("student");
		student.setAge(12);
		student.setName("bruce");
		ClassRoom classroom = (ClassRoom) ac.getBean("classroom");
		System.out.println(classroom);
		System.out.println("Debug:学生年龄" + classroom.getStudent().getAge());
		System.out.println("Debug:学生姓名" + classroom.getStudent().getName());
	}
}

使用Junit测试时候,出现下面的错误:

 java.lang.NoClassDefFoundError: org/junit/runner/manipulation/Filter

怎样解决?Spring5.0.x默认提供了Junit-4.12.jar,但是报了上面的错误,所以需要手动自己添加Junit-4.13版本的依赖。

spring源码导入idea怎么构建 spring源码环境搭建调试_spring_13

6.测试结果:.

spring源码导入idea怎么构建 spring源码环境搭建调试_eclipse_14