环境准备
- Gradle:5.6.4(类似Maven构建工具)
- Jdk:1.8.0_181
- idea:2021.1.1 Community Edition(社区版)
1、下载Spring源码
官网地址:https://github.com/spring-projects/spring-framework
选择需要的版本下载。
本例下载的是 5.2.4.RELEASE 版本,下载完后解压。
源码中有文件 import-into-idea.md ,导入idea说明文件,可以进行参考
2、使用gradle,编译compileTestJava模块
1、gradle版本选择
可以参考spring目录中的gradle版本(5.6.4)
命令:cat ./gradle/wrapper/gradle-wrapper.properties
最好使用对应版本的gradle进行编译,否则可能出现版本问题
2、设置项目的gradle仓库镜像
修改spring项目中的 build.gradle 文件,添加本地仓库 和 aliyun镜像
repositories { // 配置先从本地仓库寻找jar包,优先寻找上一个配置,找到不执行下面的配置 // 本地仓库位于USER_HOME/.m2/repository mavenLocal() // aliyun镜像 maven { url 'https://maven.aliyun.com/nexus/content/groups/public/'} // Maven的中央仓库 mavenCentral() // Spring Maven 仓库 maven { url "https://repo.spring.io/libs-spring-framework-build" } }
3、使用gradle编译compileTestJava模块
进入spring目录命令:cd /Users/h__d/Downloads/spring-framework-5.2.4.RELEASE
命令:/Users/h__d/Applications/gradle-5.6.4/bin/gradle :spring-oxm:compileTestJava
3、使用Idea打开项目
File --> Open --> 选择Spring项目目录spring-framework-5.2.4.RELEASE
4、测试使用
可以自己找到项目中的测试类进行运行
本例找的是 spring-context 项目中的 test/java包下的AnnotationConfigApplicationContextTests.java
java/org/springframework/context/annotation/AnnotationConfigApplicationContextTests.java
运行AnnotationConfigApplicationContextTests.java中的测试方法 registerAndRefresh()
能运行成功,已成功编译,且能使用
5、可能出现的问题
问题1:类 org.springframework.core.ReactiveAdapterRegistry.CoroutinesRegistrar 的引用问题
报错类 ReactiveAdapterRegistry 位置在 spring-core --> src/main/java 中
解决:问题是由于CoroutinesRegistrar类无法引用到引起的,通过搜索找到CoroutinesRegistrar的源码位置,发现CoroutinesRegistrar是一个kotlin编写的类
所以对应模块中引入它的jar包即可
引入:右键 spring-core/kotlin-coroutines/build/libs/kotlin-coroutines-5.2.4.RELEASE.jar --> Add as Library --> Create Library --> 添加到对应的模块
也可以在项目中的结构进行设置(File --> Library --> 进行设置),是spring-core.main模块能够引用到 kotlin-coroutines-5.2.4.RELEASE.jar 包
如果其他项目出现类找不到的问题,也是这种解决方案
6、自定义Spring模块使用
参考Spring项目中的其他模块
1、新建项目目录sprign-my
右键spring项目名 --> new --> Directory --> 新建目录
创建maven项目中对应的各种包
2、项目中新建文件 spring-my.gradle
description = "Spring MY" apply plugin: "kotlin" apply plugin: 'java' dependencies { compile(project(":spring-core")) optional(project(":spring-beans")) optional(project(":spring-context")) }
3、在Spring项目中添加模块spring-my
找到spring项目配置文件 settings.gradle,增加包含模块 spring-my
然后刷新grandle项目
4、对spring-my模块进行编码
编辑配置类 MainConfig.java
1 package com.test.my; 2 import org.springframework.context.annotation.Bean; 3 import org.springframework.context.annotation.Configuration; 4 5 import java.util.Date; 6 7 @Configuration 8 public class MainConfig { 9 10 @Bean 11 public Date date() { 12 Date date = new Date(); 13 return date; 14 } 15 16 }
编辑主类 MainStarter.java
1 package com.test.my; 2 3 import org.springframework.context.annotation.AnnotationConfigApplicationContext; 4 5 import java.util.Date; 6 7 public class MainStarter { 8 9 public static void main(String[] args) { 10 11 // 注解配置引用上下文 12 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class); 13 14 // 获取bean 15 Date date = (Date) context.getBean("date"); 16 System.out.println(date); 17 18 // 关闭上下文 19 context.close(); 20 } 21 }
5、测试spring-my模块
运行主类 MainStarter.java即可
7、Gradle发布Spring项目
1、项目版本修改,在文件gradle.properties 中
version=5.2.4.RELEASE-MY
2、class.jar和sources.jar及javadoc.jar 三种jar包
-
打包sourcesJar任务 和 打包javadocJar任务,代码在 gradle/spring-module.gradle 文件中
-
发布代码在gradle/publications.gradle 文件中
3、执行命令
打包sourcesJar任务命令:gradle sourcesJar
打包javadocJar任务命令:gradle javadocJar
发布到配置仓库命令:gradle publish
发布到本地仓库命令:gradle publishToMavenLocal
这样其他项目就根据maven依赖自己编译的Spring代码了
可能出现的错误
1、问题:Kotlin插件版本不对
错误:/Users/h__d/Documents/git-repository/spring-framework-5.2.4/spring-core/build/libs/spring-core-5.2.4.RELEASE.jar!/META-INF/spring-framework-5.2.4.spring-core.main.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.5.1, expected version is 1.1.16.
解决1:
可能跟idea有关,退出idea,将idea相关配置删除,使用命令窗口进行发布
解决2:
- 删除idea中原有的Kotlin插件
- 官网:https://plugins.jetbrains.com,下载对应版本的Kotlin插件
- idea离线安装Kotlin插件(可自行百度)
- 安装的时候,选择kotlin/lib/kotlin-plugin.jar 即可
2、问题:发布到本地仓库太慢
解决:
- 将 gradle/spring-module.gradle 文件中,注释掉artifact javadocJar代码
publishing { publications { mavenJava(MavenPublication) { from components.java artifact sourcesJar // artifact javadocJar } } }
- 将 gradle/publications.gradle 文件中,pom 相关的注释掉
publishing { publications { mavenJava(MavenPublication) { // pom { // afterEvaluate { // name = project.description // description = project.description // } // ...... // } } } }