spring源码下载:
github:https://github.com/spring-projects/spring-framework/tree/5.1.x
gitee:https://gitee.com/mirrors/Spring-Framework/tree/5.1.x/
说明
尝试编译spring源码,在网上搜索了许多方法进行尝试。我这里最大的问题的,在把spring源码导入IDEA时报错。有编译setting.gradle报错,java.lang.NoClassDefFoundError DefaultConvention等等。试了各种方式终于成功了。在此记录一下在此过程中的疑惑。
版本说明
网上说版本很敏感,动不动就可能出问题。这里我也记录一下
jdk:1.8.0_91
gradle:gradle-6.7-bin
idea:2020.1.3
JDK
原本就这个版本,不知道其他版本是否会有问题
Gradle版本
查看sping源码目录\gradle\wrapper的gradle-wrapper.properties文件根据distributionUrl确定gradle版本
这里不确定把gradle版本改成自己已安装的gradle版本是否可以。
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
IDEA版本
参考链接:https://blog.csdn.net/hundred_li_journey/article/details/108278795
原先是2018.2但是失败了,但是换成了2020.1.3确实没问题了
具体步骤简单记录
详细步骤查看https://blog.csdn.net/u013469325/article/details/106575704
安装Gradle
网上都有,这里简单说明一下。
官网下载链接:https://gradle.org/releases/
环境变量配置:
GRADLE_HOME:D:\gradle-6.7==>(对应自己的安装目录)
Path:%GRADLE_HOME%\bin
GRADLE_USER_HOME:F:\mavenRepositroy==>(Gradle本地仓库目录)
安装测试:
cmd输入 gradle -v
配置gradle下载远程仓库:
在gradle目录\init.d中新建init.gradle文件,内容为
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
}
}
}
修改Spring配置
查看https://blog.csdn.net/u013469325/article/details/106575704
1.修改settings.gradle文件,下载依赖的网络速度之不可描述原因,懂得人都懂,我们加上阿里云的maven仓库。
maven { url "https://maven.aliyun.com/repository/public" }
2. 修改gradle.properties文件
version=5.3.2-SNAPSHOT // 这一行应该不用改,贴出来显示一下我这里的版本
org.gradle.jvmargs=-Xmx2048M
org.gradle.caching=true
org.gradle.parallel=true
kotlin.stdlib.default.dependency=false
org.gradle.configureondemand=true
org.gradle.daemon=true
这里是参考链接的
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
3.修改build.gradle文件,加上使用阿里云仓库,提高下载速度。(这一步我是没有的)
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
准备构建
查看https://blog.csdn.net/u013469325/article/details/106575704
-
预编译spring-oxm,根据import-into-idea.md要求,我们需要先预编译spring-oxm和spring-core
cmd进入spring目录中使用命令gradlew :spring-oxm:compileTestJava
-
同上,预编译spring-core,使用命令
./gradlew :spring-core:compileTestJava
IDEA导入Spring源码
查看https://blog.csdn.net/u013469325/article/details/106575704
在导入idea时就会开始构建编译,等构建编译完成,spring源码构建也就完成
测试
为后期补充进去的和上文的spring有些区别(jdk换了11)
新建模块
既然要验证,那我们肯定需要依赖spring的模块,我们在我们刚刚新建的模块下build.gradle文件中修改使用阿里云仓库,同时依赖spring-context模块。然后重新编译
implementation(project(":spring-context"))
项目结构
package com.wwj.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.wwj")
public class WwjConfig {
}
package com.wwj.entity;
import org.springframework.stereotype.Component;
@Component
public class User {
public void sayHello() {
System.out.println("Hello World");
}
}
package com.wwj;
import com.wwj.config.WwjConfig;
import com.wwj.entity.User;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class WwjTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(WwjConfig.class);
User user = ac.getBean(User.class);
user.sayHello();
}
}