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环境变量
新增系统变量
Path变量添加一条
%GRADLE_HOME%\bin
4.使用Idea,直接open选中源码项目打开
注意打开Idea应该会自动加载,全部点取消
打开项目之后,【File】->【Settings】,设置Gradle,Gradle user home这个目录你自己设置一个空文件夹。如果不设置的话,它默认是C:\Users\用户名.gradle,这个目录你就可以认为相当于 是我们的本地的maven仓库,gradle编译项目所依赖的jar都会下载后放入这个目录中。JVM默认我这里就是jdk8,jdk至少就是jdk8。
5.打开build.gradle文件,在文件头部加上Spring插件库
(这个就相当于是maven的pom文件),
buildscript {
repositories {
maven { url 'https://repo.spring.io/plugins-release-local' }
}
}
网上的基本都是
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
就是禁止匿名访问
6.bulid.gradle文件添加阿里镜像
搜索repo
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.等待下载依赖
都修改好之后,保存一下,点击页面下图刷新图标,等待项目下载依赖构建即可,如果有报错多刷新几遍
8.查看是否构建成功
构建成功之后,找到 ApplicationContext 类,打开后,按下Ctrl+Alt+U键,如果出现下图所示类图界面说明构建成功了
此时可以查看Spring的源码了,但是我们需要在源码的基础上面进行修改,开发,调试,添加注释等等 操作,所以需要将源码进行编译打包,下面我们将进行编译源码编译
9.spring-aspects模块问题解决
一般情况下在编译spring源码时,spring-aspects模块是不能和其它模块(spring-core等)在导入IDEA时一起编译的,因为它依赖了aspectJ
因此要解决,网上的博客要么直接在项目中排除spring-aspects模块,即不编译spring-aspects,要么就是如下方式解决
9.1下载AspectJ编译器
去AspectJ官网下载AspectJ编译器,下载aspectj1.9.5的。
选择一个国内镜像
下载好了后cmd切换到下载的目录下,执行java -jar aspectj-1.9.5.jar 命令安装ajc编译器。选择jdk目录
9.2idea安装Aspectj插件
请注意
网上的很多教程安装的插件是两个,Spring AOP/@AspectJ和AspectJ Support
但是现在这两个都搜不到了,只有AspectJ,猜测应该是把上面两个融合在一起了
9.3 将Idea编译器设置为ajc
将Idea编译器设置为ajc,然后设置AspectJ安装目录下的lib文件夹中的aspectjtools.jar文件,再勾选Delegate to Javac选项。
9.4 spring-aop_main和spring-aspectjs_main 添加aspectj
将 spring-aop_main 和 spring-aspectjs_main 两个模块添加 AspectJ Facets,打开:File–Project Structure–Modules
**spring-aspectjs_main同样操作。**别忘了
10.编译
先编译spring-oxm下的compileTestjava,选中双击即可,编译完成出现BUILD SUCCESSFUL代表编译完成
再编译下spring-core模块,因为之后的spring-context依赖于core,方法同上。
都编译完成且成功之后,最后开始编译整个工程(这个过程非常耗时间),打开顶层项目spring->build->build,双击开始编译
编译完后,如果有一些用不到的模块编译失败,不用管它,例如spring-webflux
11.测试基本功能
都编译成功之后,可以添加一个测试模块进来,进行测试源码构建编译是否真的完成
步骤:【File】->【New】->【Module…】 在Spring中添加自己的module模块,同样选择gradle构建。
- 找到我们自己的测试模块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'
}
- 下面编写一个简单的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类
表明环境已经成功了
12.测试aspectj
test项目的build.gradle添加aspectj依赖
添加完成后记得构建一下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.控制台乱码问题解决
- 修改 IntelliJ IDEA 全局编码、项目编码、属性文件编码
- IDEA 中自定义虚拟机选项:Help→Etit Custom VM Options
3.在test项目中的build.gradle里加个设置,要求编码用UTF-8
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
- 同时也在Gradle RunConfigurations 中 添加虚拟机参数配置UTF-8
- 在IDEA 中 编辑 Help | Edit Custom VM Options ,加入下面的参数
-Dfile.encoding=UTF-8
完成上面几步后,关闭IDEA,再打开,再运行Test类的main方法
至此解决。
网上 大多数都都是这几步,有的还加下面这步,如果上面的方法都没有解决可试试下面这步
setting>gradle>build and run using项 默认的是gradle,改选idea项,但是我这样弄,编译都报错
本文章参考并结合了下面文章,太多坑了。