一、查看spring5.2 支持的gradle版本为5.6.4
1、下载Gradle
官网下载:https://gradle.org/releases
选择某一版本的binary-only进行下载,解压到/usr/local目录下
2、配置环境变量
编辑bash_profile文件:
vi ~/.bash_profile
加入如下内容:
#GRADLE
GRADLE_HOME=/usr/local/gradle-5.6.4
PATH=$PATH:$GRADLE_HOME/bin
export GRADLE_HOME GRADLE_USER_HOME PATH
执行下面命令使内容生效:
source ~/.bash_profile
测试安装是否成功:
gradle -v
Welcome to Gradle 5.6.4!
Here are the highlights of this release:
- Incremental Groovy compilation
- Groovy compile avoidance
- Test fixtures for Java projects
- Manage plugin versions via settings script
For more details see https://docs.gradle.org/5.6.4/release-notes.html
------------------------------------------------------------
Gradle 5.6.4
------------------------------------------------------------
Gradle 加速
给 Gradle 配置一个阿里的数据源,加速项目的构建(加上下载 Jar 包),
找到配置文件目录init.d 新建init.gradle配置文件,
我的应用目录在 /usr/local/gradle-5.6.4/init.d
新建配置文件
touch init.gradle
vi init.gradle
添加如下配置:
allprojects {
repositories {
maven {
url "http://maven.aliyun.com/nexus/content/groups/public"
}
}
}
3.下载最新版的Spring5.1源码(5.2编译报错,改成5.1版本gradle不变,编译通过)
Spring 源码地址:
https://github.com/spring-projects/spring-framework
源码下载加速
因为 Spring 的源码文件比较多,如果使用 Spring 原地址下载的话时间会非常长,甚至会失败尝试很多次才能完成,此时我们可以使用国内码云(gitee)上的地址,下载速度会快很多,码云的地址为
https://gitee.com/mirrors/Spring-Framework
使用官方提供的 Spring 源码地址,每天同步一次。
tips:其它git项目同样可以通过gitee中转方式快速下载。
4.导入和编译Spring
Spring 源码下载完成之后,我们就可以使用 IDEA 导入源码项目了,为了加快源码编译的速度,在导入之后我们可以编辑 Spring源码根目录下的 settings.gradle 文件,添加阿里的源配置信息:
maven { url "http://maven.aliyun.com/nexus/content/groups/public/"}
接下来我们就可以导入 Spring 源码了,点击 Import Project,选择 Spring 源码的路径,选择 Gradle 方法导入,
然后点击 Finish 就会进入项目的自动构建阶段了。
Spring 构建完成(耗时12分钟),
到现在为止,Spring5.1 源码的搭建就已经完成了。
二、调试Spring源码
首先我们在 Spring 源码项目中新增一个测试项目,点击 New -> Module...创建一个 Gradle 的Java 项目,
spring-test
创建完成之后,在 build.gradle 中添加对 Spring源码的依赖:
api(project(":spring-context"))
接着,我们需要在项目中创建一个bean 和配置文件(application.xml)及启动文件(MyApplication.java)。
bean 实现代码如下:
public class Person {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
启动类MyApplication 代码如下:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyApplication {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("classpath*:application.xml");
Person person = context.getBean("person", Person.class);
System.out.println(person.getName());
}
}
配置文件 application.xml(在 resources 中)配置如下:
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="person" class="org.springframework.beans.Person">
<property name="id" value="1"/>
<property name="name" value="spring5.1"/>
</bean>
</beans>
接下来我们就可以启动并调试 Spring 的源码了
三、解决 cglib和objenesis的编译错误
添加相关依赖
spring目录下执行命令:
gradle objenesisRepackJar
gradle cglibRepackJar
四、找不到符号 InstrumentationSavingAgent
Error:(26, 38) java: 找不到符号
符号: 类 InstrumentationSavingAgent
位置: 程序包 org.springframework.instrument
解决:将spring-context.gradle文件的
下面这一行
optional(project(":spring-instrument"))
修改为
compile(project(":spring-instrument"))
五、程序包org.springframework.oxm等不存在
解决:spring-test/build.gradle中添加如下3行
optional(project(":spring-oxm"))
optional(project(":spring-context-support"))
optional(project(":spring-messaging"))
日志报错,不影响代码运行
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
重新迁移项目后修改配置
spring源码根目录下的build.gradle文件:注释configurations.all ,同时添加5行 如下
allprojects{
repositories{
maven{ url'http://maven.aliyun.com/nexus/content/groups/public/'}
}
}
// configurations.all {
// // Check for updates every build
// resolutionStrategy.cacheChangingModulesFor 0, "seconds"
//
// // Consistent slf4j version (e.g. clashes between slf4j versions)
// resolutionStrategy.eachDependency { DependencyResolveDetails details ->
// if (details.requested.group == "org.slf4j") {
// details.useVersion slf4jVersion
// }
// }
// }
修改gradle.properties文件
org.gradle.daemon=true
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.parallel=true
org.gradle.configureondemand=true
修改setting.gradle文件,在第一行添加下面的配置
pluginManagement{
repositories{
maven{ url"https://maven.aliyun.com/repository/public" }
gradlePluginPortal()
maven{ url'https://repo.spring.io/plugins-release' }
}
}