超详细图解!基于IDEA+Gradle+jdk11搭建Spring框架源码阅读环境

简介: 超详细图解!基于IDEA+Gradle+jdk11搭建Spring框架源码阅读环境

image.png

Spring框架的重要程度不言而喻!

在尝试阅读Spring源码时,在第一步搭建环境上被劝退很多次(确实比较复杂),而且网上搜了很多博客、文章后发现,不是Spring版本老,就是Gradle或者Idea版本老。于是昨天肝到深夜,参考了很多资料,终于搭建成功了Spring5.3.x版本的源码环境!

在分析Spring框架源码之前,首先要搭建起来Spring的源码环境,由于Spring源码并不是托管于maven的,而是托管于Gradle,因此我们需要先下载版Gradle,此外还额外需要本机电脑配置JDK11环境(必须是11,否则Spring源码环境编译过不去)。下面我们就从安装环境开始:

先统一下环境版本要求:


Spring源码版本5.x


Gradle6.4.x及其以上版本


Jdk11(最好是11,jdk8也可以,但是不敢保证一遍成功)


一、JDK11 安装

下载与安装

Oracle官方下载地址:https://www.oracle.com/java/technologies/javase-jdk11-downloads.html

我的电脑是Win10,所以下载下面这个安装包:

image.png

  • 如果官网下载速度慢,这里提供一个百度云链接:https://pan.baidu.com/s/1LOUVsO2orCUtKRdjOKqGCA提取码:qqo5
  • 下载完成后执行exe安装包,自己选一个安装路径(我的是默认路径),点击下一步:
  • image.png
  • 等待安装完成:
  • image.png

配置环境变量

  • 右键 -> 我的电脑 -> 属性:
  • image.png
  • 选择 -> 高级系统设置 -> 环境变量:
  • image.png
  • 选择新建系统环境变量JAVA_HOME:

变量名:JAVA_HOME

变量值:jdk安装的地址(我使用的是默认地址:C:\Program Files\Java\jdk-11.0.6)

注意:如果本机安装由jdk8 的环境,这里只需要找到JAVA_HOME并将变量值修改为jdk11的安装路径即可~


image.png

image.png

image.png

在系统环境变量CLASSPATH中新增如下内容:

  • 变量名: CLASSPATH
  • 变量值: .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
  • 注意,一定不要忽略了前面的英文句号.啊!
  • image.png
  • 最后一步,找到系统变量中的Path,加入如下内容:
  • %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

image.png

点击确定,并通过cmd 查看环境变量配置是否生效:java -version

image.png

JDK8更换JDK11遇到的问题:

更换JDK版本后,修改环境变量,cmd查看版本时仍为jdk8的解决办法:https://blog.csdn.net/qq_26369317/article/details/80922425


二、Gradle5.6.3 的安装

下载与安装

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

gradle-x.x-bin.zip是需要下载的安装发布版(使用这个就行!注意:这里建议大家下载Gradle6.4.x的版本,在写这篇文章的时候我采用的是Gradle5.6.3这个版本,后来有些粉丝私信反应Spring5.3.x,用Gradle5.x的版本好像会有一些问题,但是不是每个人都出问题,所以为了顺应新版本的Spring,建议尽量采用6.x版本的Gradle!)

gradle-x.x-src.zip是源码

gradle-x.x-all.zip则是下载全部的文件


image.png

image.png

下载完毕后,在自己指定的磁盘中新建Gradle文件夹,并将下载的压缩包解压到该文件夹中:

image.png

如下图所示:

image.png

配置环境变量

下载解压完毕后,去进行环境变量的配置,gradle的配置类似于maven和jdk的配置:

右键 -> 我的电脑 –> 属性 –> 高级系统设置 –> 环境变量 –> 系统变量:

在系统变量中新增一个GRADLE_HOME,其值为解压后的路径(我的是F:\Gradle\gradle-5.6.3-all\gradle-5.6.3)


image.png

  • 然后,修改系统Path变量,在Path变量添加 %GRADLE_HOME%\bin

image.png

点击确定,然后就通过cmd命令去测试一下是否配置成功:gradle -v

image.png

查看到gradle的版本信息,配置成功~

创建Gradle的本地jar包仓库文件夹

  • 在我们解压gradle的文件夹下执行cmd命令:mkdir .gradle
  • image.png
  • 则,我们创建的.gradle文件夹就是用来存放所下载的jar包仓库主目录!配置Gradle镜像在Gradle安装目录下的 init.d 文件夹下,新建一个 init.gradle 文件:
  • image.png
  • 在该文件里面填写以下配置:
allprojects{
    repositories {
        def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/'
        all { ArtifactRepository repo ->
            def url = repo.url.toString()
            if ((repo instanceof MavenArtifactRepository) && (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com'))) {
                project.logger.lifecycle 'Repository ${repo.url} replaced by $REPOSITORY_URL .'
                remove repo
            }
        }
        maven {
            url REPOSITORY_URL
        }
    }
}

三、IDEA中配置Gradle,并搭建Spring源码环境

IDEA克隆Spring代码仓库

GitHub托管的Spring项目地址:https://github.com/spring-projects/spring-framework

使用HTTPS的方式克隆:https://github.com.cnpmjs.org/spring-projects/spring-framework.git

image.png

打开IDEA:

image.png

  • 从远程GitHub仓库,将Spring项目源码克隆到本机:


image.png

  • 点击克隆等待克隆完毕,项目初始化,当初始化完成后,如果出现如下情况:

image.png

说明IDEA未配置Gradle,以及Gradle镜像!请接着往下操作:

IDEA配置Gradle

  • 打开IDEA -> setting -> Build,Execution,Deployment -> Build Tools -> Gradle,如下:
  • image.png
  • 配置修改如下:
  • image.png
  • 设置成功后,再继续往下配置:

修改Spring项目源码中Gradle相关配置

主要修改的地方如下几个文件:

image.png

  1. import-into-idea.md:这是官方提供的spring源码导入idea的步骤和注意说明,可以移步:IDEA导入Spring源码调试必看了解一下!
  • 2.修改settings.gradle文件,下载依赖的网络速度之不可描述原因,这里需要加上阿里云的maven镜像仓库:
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
maven { url "https://maven.aliyun.com/repository/public" }

修改好之后如下图所示:

image.png

3.修改gradle.properties文件,都已经加了详细注释:

version=5.3.0-SNAPSHOT
## 设置此参数主要是编译下载包会占用大量的内存,可能会内存溢出
org.gradle.jvmargs=-Xmx2048M
## 开启 Gradle 缓存
org.gradle.caching=true
## 开启并行编译
org.gradle.parallel=true
## 启用新的孵化模式
org.gradle.configureondemand=true
## 开启守护进程 通过开启守护进程,下一次构建的时候,将会连接这个守护进程进行构建,而不是重新fork一个gradle构建进程
org.gradle.daemon=true

修改好之后如下图所示:

image.png

4.修改build.gradle文件,加上使用阿里云仓库,提高下载速度:

repositories {
  // 新增2个阿里镜像地址
  maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
  maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }
  mavenCentral()
  maven { url "https://repo.spring.io/libs-spring-framework-build" }
  // 新增spring插件库
  maven { url "https://repo.spring.io/plugins-release"}
}

修改好之后如下图所示:

image.png

  • 5.这里还需要再改一个地方,就是如下位置中的gradle-wrapper.properties文件:

image.png

这个压缩包也可以自己下载,不用6.8.3版本的,用自己下载的版本也可以。我这里用6.8.3版本的压缩包,是因为,Spring5.3.8源码默认用的是6.8.3版本的gradle!


Spring源码的构建、编译

在Spring源码的本机位置,打开cmd,执行命令:gradlew :spring-oxm:compileTestJava,去预编译spring-oxm模块!


image.png

image.png

等待命令执行结束:

image.png

同上,预编译spring-core模块,执行命令gradlew :spring-core:compileTestJava,并等待命令执行结束:

image.png

到这儿,使用IDEA + Gradle构建Spring5源码就已经全部完成。


四、源码环境验证

最后一部,就是去验证一下我们搭建的Spring源码环境是否可以正常运行:


简单测试:Spring源码给我们提供了测试环境搭建是否正常的包,测试运行spring-context模块下的test包:


image.png

执行结果如下图:

image.png

功能测试:自己建立一个模块去测试Spring源码的功能。在spring-framework项目下新建我们自己的测试module,如下图所示:

image.png

image.png

image.png

等待模块创建完毕后,向子模块的build.gradle文件指定位置加入如下代码:

compile(project(":spring-context"))
compile("org.aspectj:aspectjrt:1.9.5")
compile("org.aspectj:aspectjweaver:1.9.5")

如下图:

image.png

这里其实就相当于maven工程的pom.xml文件,加入上述代码的目的是为了在子模块my-spring-test中引入spring-context模块的依赖。

  • 为子模块新建java目录结构(IDEA可以自动生成)New -> Directory:
  • image.png
  • 自动新建如下三个模块:
  • image.png
  • 新建完成后结果如下图:
  • image.png
  • 在java包下新建com.myspring.test包,并创建相关测试类以及spring配置文件:

测试主函数类

/**
 * date: 2021/5/13
 * @author csp
 * 测试主函数类
 */
public class Main {
  public static void main(String[] args) {
    // 读取spring配置文件
    ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-test.xml");
    // 获取service的bean对象
    UserService userService = (UserService) context.getBean("userService");
    // 执行service方法查询user对象
    User user = userService.getUserById(1);
    // 输出user结果
    System.out.println(user);
  }
}

User实体类

/**
 * date: 2021/5/13
 *
 * @author csp
 * User实体类
 */
public class User {
  private String name;
  private int age;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  @Override
  public String toString() {
    return "User{" +
        "name='" + name + '\'' +
        ", age=" + age +
        '}';
  }
}

service接口

/**
 * date: 2021/5/13
 * @author csp
 * service接口
 */
public interface UserService {
  User getUserById(int id);
}

service接口实现类

/**
 * date: 2021/5/13
 * @author csp
 * service接口实现类
 */
public class UserServiceImpl implements UserService {
  @Override
  public User getUserById(int id) {
    User user = new User();
    user.setAge(22);
    user.setName("兴趣使然の草帽路飞");
    return user;
  }
}

resources下新建spring配置文件spring-text.xml

<?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">
    <!--xml的方式将UserServiceImpl注入ioc容器-->
  <bean id="userService" class="com.myspring.test.UserServiceImpl"/>
</beans>

测试运行,输出如下结果,说明环境搭建没有问题了:

image.png

参考文章:https://www.cnblogs.com/mazhichu/p/13163979.html

  • 本篇是Spring源码系列第一篇,后续会陆续更新,如果对大家有帮助,请三连支持一下!
  • 如果搭建出现问题,欢迎评论区留言,及时帮大家解决!
  • image.png


相关文章
|
3天前
|
Java Maven 开发工具
IDEA使用Spring Initializr流畅的创建springboot项目
IDEA使用Spring Initializr流畅的创建springboot项目
17 0
|
1天前
|
前端开发 Java 数据库连接
Java与Spring框架的深度融合
Java与Spring框架的深度融合
|
3天前
|
监控 前端开发 Java
深度揭秘:Spring 框架如何助力企业应用腾飞?
【6月更文挑战第25天】Spring框架通过依赖注入降低耦合,如示例中UserService与UserRepository的交互。AOP功能如LoggingAspect示例,使横切关注点如日志与主业务分离。事务管理注解简化了数据库操作的事务控制,如@Transactional。此外,Spring的MVC支持简化Web开发,如UserController所示。综上,Spring提供一站式解决方案,助力企业应用高效开发和腾飞。
|
3天前
|
消息中间件 监控 Java
Java 框架界的‘巨星’Spring,让你的代码翩翩起舞!
【6月更文挑战第25天】Spring,Java框架的明星,以其依赖注入(DI)和面向切面编程(AOP)简化开发。DI协调类间协作,AOP提供日志、监控等附加功能。事务管理确保代码稳定性,注解如`@Transactional`自动化事务处理。Spring的集成能力使代码灵活适应多样技术场景,让编程变得优雅高效,犹如舞蹈般流畅。跟随Spring,让代码起舞!
|
3天前
|
供应链 Java 开发者
Spring 框架:Java 界的‘万能钥匙’,你的企业应用开发新宠!
【6月更文挑战第25天】# Spring框架:Java开发的基石!它提供一站式解决方案,涵盖依赖注入、AOP、事务管理等,简化复杂应用开发。通过注解如`@Service`、`@Autowired`实现代码解耦,`@Transactional`自动化事务处理,加上AOP实现全局日志记录,让维护变得简单。Spring,企业级开发的首选!
|
3天前
|
Java 开发者 Spring
从入门到精通,Spring 框架带你玩转 Java 企业应用开发!
【6月更文挑战第25天】Spring框架简化了Java企业开发,通过依赖注入降低耦合,如使用构造函数注入`UserService`中的`UserDao`。它还提供声明式事务管理,如`@Transactional`注解自动处理事务,减少手动错误。此外,Spring的AOP支持允许在不侵入业务逻辑的情况下实现横切关注点,如`LoggingAspect`所示。无论是新手还是资深开发者,Spring以其全面的功能和灵活性成为企业应用开发的强大工具。
|
3天前
|
缓存 Java 测试技术
Spring 框架,不只是依赖注入和面向切面那么简单!
【6月更文挑战第25天】Spring框架超越DI和AOP,涵盖事务管理、数据访问抽象如`JdbcTemplate`、消息驱动支持如`@JmsListener`、缓存管理和测试工具。示例代码展示了其简化复杂性的能力,如自动事务处理、数据库操作及消息队列监听。Spring是构建高效企业级应用的全面解决方案。
|
2天前
|
前端开发 Java 开发者
那些年,我们与 Spring 框架一起走过的路……
【6月更文挑战第25天】Spring框架简化了Java开发,通过依赖注入降低了耦合,如`@Autowired`自动装配bean。AOP允许横切关注点(如日志和事务)模块化,如`@Before`和`@AfterReturning`定义切面。`@Transactional`注解轻松实现事务管理,保证数据一致性。Spring MVC在Web开发中提供注解驱动和简洁路由,提升效率。它伴随开发者成长,不断优化解决方案。
|
2天前
|
前端开发 Java 开发者
Spring 框架:Java 企业应用开发领域的“隐形冠军”!
【6月更文挑战第25天】Spring框架在Java开发中扮演重要角色,提倡依赖注入、事务管理及面向切面编程的最佳实践。例如,通过`@Autowired`实现接口注入,保持代码松耦合;使用`@Transactional`确保数据一致性;借助`@Aspect`定义AOP切面,分离关注点;使用Java配置增强可维护性;以及在Spring MVC中利用注解驱动提升Web应用效率。遵循这些最佳实践,开发者能打造高效、可扩展的应用。
|
15小时前
|
Java 程序员 Spring
Spring 源码阅读 一
Spring 源码阅读 一