SpringFramework源码编译

SpringFramework源码编译

在编译 SpringFramework 源码时,注意事项较多,掌握之后相对来说还是比较简单的。

0. 基础环境

  • JDK:1.8 及以上即可(官方文档要求 JDK 8 update 262 or later),笔者编译时的版本时 JDK 8 update 251
  • IDEA:这个不确定,笔者使用的是 IDEA 2019.2.4
  • Gradle:有的文档说官方文档要求 Gradle 需要低于 Gradle 6 的版本(没有查证),可以根据 spring framework 源码
    gradle/wrapper/gradle-wrapper.properties 中指定的版本去下载,笔者使用的是 gradle-5.6.4-bin.zip

1. spring framework 源码下载

  1. 直接进入 spring framework 源码 github 官方仓库 中,选定版本(5.0.x 或 5.1.x 或 5.2.x)后,下载在本地
  2. 将 spring framework 源码 github 官方仓库 fork 到自己的 github 仓库中,然后 git clone 到本地,本地可以通过 git checkout -b localBranchName origin/remoteBranchName 拉取远程分支到本地并直接切换

2. gradle 配置修改

gradle 与 maven 类似,都需要从远程仓库中拉取依赖到本地仓库,才能运行,而在编译 spring framework 源码中,笔者个人觉得 依赖的下载劝退部分人没有完成源码编译 的最大问题,而解决该问题的主要方案同 maven 类似,就是 添加 maven仓库镜像修改某些配置

2.1 settings.gradle 添加 阿里云 maven 仓库镜像

settings.gradle 在 spring framework 根目录下,修改如下

修改前:

pluginManagement {
	repositories {
		gradlePluginPortal()
		maven { url 'https://repo.spring.io/plugins-release' }
	}
}

修改后:

pluginManagement {
	repositories {
		maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
		maven { url 'https://maven.aliyun.com/repository/spring-plugin'}
		maven { url "https://maven.aliyun.com/repository/public" }
		maven { url "https://maven.aliyun.com/repository/central" }
		gradlePluginPortal()
		maven { url 'https://repo.spring.io/plugins-release' }
	}
}

注意:不要删除原有的 maven 仓库地址,可能有的依赖(或插件)只在原有的 maven 仓库地址才有

2.2 build.gradle 添加 阿里云 maven 仓库镜像

build.gradle 也在 spring framework 根目录下,修改如下

修改前:

repositories {
    mavenCentral()
    maven { url "https://repo.spring.io/libs-spring-framework-build" }
}

修改后:

repositories {
    maven { url "https://maven.aliyun.com/repository/apache-snapshots" }
    maven { url "https://maven.aliyun.com/repository/spring" }
    maven { url "https://maven.aliyun.com/repository/google" }
    maven { url 'https://maven.aliyun.com/repository/central'}
    maven { url "https://maven.aliyun.com/repository/public" }
    mavenCentral()
    maven { url "https://repo.spring.io/libs-spring-framework-build" }
}

注意:不要删除原有的 maven 仓库地址,可能有的依赖(或插件)只在原有的 maven 仓库地址才有

2.3 gradle.properties 修改配置

修改前:

version=5.2.9.BUILD-SNAPSHOT
org.gradle.jvmargs=-Xmx1536M
org.gradle.caching=true
org.gradle.parallel=true
kotlin.stdlib.default.dependency=false

修改后:

version=5.2.9.BUILD-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. 源码命令行编译测试

在 spring framework 根目录下执行两条编译测试

./gradlew :spring-oxm:compileTestJava // 官方建议
./gradlew :spring-core:compileTestJava

在这个过程,就是下载项目中需要各个的 插件(plugin)依赖(dependency),这个过程可能会失败。
个人经验:重试 gradelew 命令 直到成功!!!

注意:默认情况( spring-framework\gradle\wrapper\gradle-wrapper.properties 文件未做修改)下,各种依赖和插件会下载到 用户主目录/.gradle/caches/modules-2/files-2.1 文件夹(目录)中

4. 导入到 IDEA

IDEA --> Import Project --> 选定项目根目录或选定项目根目录下的 build.gradle 文件 --> OK
IDEA --> File --> New --> Project from Existed Sources… --> 选定项目根目录或选定项目根目录下的 build.gradle 文件 --> OK

如果在 IDEA --> Settings --> Build Tools --> Gradle 配置中,use gradle from 选项,可以指定本地下载的 gradle 应用程序,后续各种依赖和插件会下载到 gradle应用程序根目录/caches/modules-2/files-2.1 文件夹(目录)中

所以导入的时候,需要重新下载依赖和插件(比步骤3更多)

5. 编译后测试

在 spring framework 项目下新建 gradle java 子项目,新建之后,笔者的项目中只有一个 build.gradle 文件,没有默认的 src 项目结构,如果你也是这样,可以在 build.gradle 文件中加入如下代码

task "create-dirs" {
    sourceSets*.java.srcDirs*.each {
        it.mkdirs()
    }
    sourceSets*.resources.srcDirs*.each{
        it.mkdirs()
    }
}

之后刷新 gradle ,在新建的子项目中运行新建的 task:

gradle --> spring --> 你的项目名 --> Tasks --> other --> create-dirs

6. 其它

笔者在 build 整个项目时,是直接成功的,并没有针对 aspectj 报错(后来发现是因为在IDEA中的gradle配置中选择的是 gradle 编译,才运行成功的),如有此方面的问题(当把IDEA中的gradle配置修改为 IDEA 编译,则会报 aspectj 编译错误的问题),此时可参考听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译

参考文档:

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值