目录
前言:
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版本:
下面的仅供参考:
之前编译5.2.x版本的源码,遇到错误,原因是编译spring对gradle的版本是有要求的,我们先看看spring 5.2.x源代码中的信息:
JMH(jmh-gradle-plugin)的版本是0.6.4, 而JMH跟gradle是有对应关系的,请看https://github.com/melix/jmh-gradle-plugin。JMH 0.6.4对应的gradle版本是6.8+。
如果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或者以后的版本都行.
但是我的JDK版本是201,JRE版本是281,总是出现一些莫名其妙的错误,所以统统将其改为更高版本的291试试。
4.编译源码:
4.1.编译源码:
按照官网的要求执行"gradlew build" 或者直接执行"gradlew.bat"。这个没有碰到过问题,编译成功。
4.2.转化为eclipse工程:
执行"import-into-eclipse.bat", 成功后结果如下:
5.安装eclipse插件:
- 按照spring源码中的guide,去安装eclipse需要的插件,Kotlin, Groovy, AJDT, TestNG等等。
- build其中的某个模块,例如spring-oxm
- 应用特定于项目的设置, “gradlew eclipseBuildship”等等
查看官方文档,要求将Groovy插件的版本修改为2.5,但是目前使用的Eclipse Luna版本安装插件后,仅仅支持到2.4, 没办法,使用高版本的Eclipse 2020-03 (4.15.0)
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文件中最后三行注释掉。
然后就能成功导入了.
7.创建测试模块:
1.每个模块中提供了Junit测试代码,可以直接使用,也可以添加或者修改。
2.自己创建测试模块:
- 在spring项目中创建一个子模块的文件夹,例如bruce-test
- 在文件夹中添加build.gradle文件, 可以将其名字改成与模块名字一致,bruce-test.gradle
- 在spring项目中的settings.gradle中引入子模块,例如在文件中添加 include "bruce-test"
- 在spring项目上右键gradle-->refresh
- 然后创建src.main.java,src.main.resources, src.test.java等文件夹
- 创建包名,添加class文件。
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版本的依赖。
6.测试结果:.