Spring5 源码编译:环境搭建+测试

目录

1. 搭建gradle环境和下载源码

1.1. 下载源码

1.2. 搭建gradle环境

1.3. 配置gradle的默认镜像

2. 预编译spring-oxm

2.1. 配置build.gradle

2.2. 配置settings.gradle

2.3. 预编译

2.4. 结果

3. 构建源码

3.1. 导入Idea

3.2. 开始构建

3.3. 错误

4. 测试

4.1. 搭建测试Module

4.2 踩的坑

4.2.1. 找不到符号 coroutinesutils

4.2.2  No tasks available

4.2.3. 引入cglib时缺失jar包

4.2.4. 找不到org.springframework.aop.target

参考


1. 搭建gradle环境和下载源码

1.1. 下载源码

上github搜 spring-framework,找到star数最多的,用git clone或者下载.zip文件的形式都可以,把源码下载下来。

打开源码文件夹,在 gradle -> wrapper -> gradle-wrapper.properties 文件中,找到如下属性配置:

distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip

根据上面的gradle版本号,去 https://services.gradle.org/distributions/ 下载对应版本的gradle文件。

bin结尾的是gradle执行环境,src结尾的是源码文件,all结尾的包括bin和src。

 

下载gradle文件后,一份用于搭建gradle环境,另一份拷到源码文件夹的gradle -> wrapper 目录下,

然后将上述属性配置改为:

distributionUrl=gradle-5.6.4-bin.zip
这样在使用gradlew进行预编译时,就不用再去下载执行文件了。

 

1.2. 搭建gradle环境

解压你的gradle文件到自定义的安装目录下,然后用如下命令创建一个本地仓库:

mkdir .gradle

本地仓库的位置自己定。

然后配置环境变量:

>1 新建变量:GRADLE_HOME,就是你的gradle的安装目录,比如:D:\DevTools\gradle\gradle-5.6

>2 新建变量:GRADLE_USER_HOME,这个是你的gradle的本地仓库目录,比如:D:\DevTools\gradle\.gradle

>3 在Path中,添加:%GRADLE_HOME%\bin

>4 如果有maven仓库,并且想在构建项目时使用maven仓库,配置的maven地址必须是M2_HOME(不能是 MAVEN_HOME),否则gradle找不到你的maven配置。

打开命令行,输入gradle -v,如果弹出提示,则配置成功。

 

1.3. 配置gradle的默认镜像

在你的gradle仓库中(.gradle目录下),新建一个init.gradle文件,其中写入:

allprojects{
    repositories {
        mavenLocal()
        maven { url "https://maven.aliyun.com/nexus/content/groups/public/"}
        def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/public/'
        def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter/'
        def ALIYUN_GOOGLE_URL = 'https://maven.aliyun.com/repository/google/'
        def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin/'
        all { ArtifactRepository repo ->
            if(repo instanceof MavenArtifactRepository){
                def url = repo.url.toString()
                if (url.startsWith('https://repo1.maven.org/maven2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
                    remove repo
                }
                if (url.startsWith('https://jcenter.bintray.com/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
                    remove repo
                }
                if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GOOGLE_URL."
                    remove repo
                }
                if (url.startsWith('https://plugins.gradle.org/m2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."
                    remove repo
                }
            }
        }
        maven { url ALIYUN_REPOSITORY_URL }
        maven { url ALIYUN_JCENTER_URL }
        maven { url ALIYUN_GOOGLE_URL }
        maven { url ALIYUN_GRADLE_PLUGIN_URL }
    }
}

 

2. 预编译spring-oxm

2.1. 配置build.gradle

我下载的源码目录为:spring-framework-study,那么进入该目录你可以看到一个import-into-idea.md,

打开它可以看到引入idea前需要做的工作:

 

1. Precompile `spring-oxm` with `./gradlew :spring-oxm:compileTestJava`
2. Import into IntelliJ (File -> New -> Project from Existing Sources -> Navigate to directory -> Select build.gradle)
3. When prompted exclude the `spring-aspects` module (or after the import via File-> Project Structure -> Modules)
4. Code away

解释一下:

1 你需要预编译spring-oxm;2 选择build.gradle导入idea;3 将spring-aspects从项目结构中排除

 

打开源码主目录下的build.gradle,先配置镜像:

buildscript {
    repositories {
        maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
        maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
        google()
        jcenter()
    }
}
​
plugins {
    ...
}
​
allprojects {
    repositories {
        maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
        maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
        google()
        jcenter()
    }
}
 

注意:gradle配置时,buildscript和plugins必须在第一行配置。如果有buildscrpit,那么它必须在第一行。

(plugins中的插件后面可能带有 apply false,将 apply false 全部删除,即应用所有插件)

 

找到 build.gradle中的 configure(allprojects) 中的 repositories,配置如下:

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

注意:所有的仓库配置url前的http都要加上s:"https://xxx",要不然 > Task :checkstyleNohttp 任务会报错。

 

2.2. 配置settings.gradle

将 include "spring-aspects" 注释掉:

//include "spring-aspects"

 

2.3. 预编译

在项目目录下,运行命令行命令(windows下):

gradlew.bat :spring-oxm:compileTestJava

注意:网上说的中间加 cleanIdea,此时(第一次编译)并不管用,会报错。

 

2.4. 结果

如果结果中有 BUILD SUCCESSFUL 字样就明预编译成功,

可能出现的错误:

Build scan background action failed.
org.gradle.process.internal.ExecException: Process 'command 'git'' finished with non-zero exit value 128

git的问题,暂时还不知道如何解决,不影响构建。

 

3. 构建源码

3.1. 导入Idea

Idea中,import project ,然后选择源码主目录下的build.gradle,然后导入。

配置本地的gradle:

 

导入后,会进行configure build,过程很漫长。

还是找BUILD SUCCESSFUL字样。

 

3.2. 开始构建

在gradle选项卡中,找到build命令,双击开始构建

 

又是一个漫长的过程。

构建完毕后,找BUILD SUCCESSFUL字样。

 

3.3. 错误

1. 如果构建过程中报错,采用如下办法:

一开始尝试直接构建Spring源码,在构建的过程中会报错,通过修改docs.gradle 脚本,注释 dokka 和 asciidoctor

docs.gradle文件在gradle目录下。

 

2. 报错:validUsage()

at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686)
注释:spring-test.gradle中这行代码 
// useJUnitPlatform { 
    // includeEngines 'junit-jupiter' 
    // excludeTags 'failing-test-case' 
// }

 

4. 测试

4.1. 搭建测试Module

在主目录下新建Module,然后选择gradle -> jar,ArtifactId和groupId自己填。

项目结构如下:

 

在新建的Module中的build.gradle,添加如下依赖:

dependencies {
    compile(project(":spring-context"))
    compile(project(":spring-instrument"))
    compile 'junit:junit:4.12'
    compile group: 'org.hamcrest', name: 'hamcrest-core', version: '1.3'
}

我的TestApp是我的主程序入口,在其中用到了junit,所以需要在添加依赖时,使用compile,而不是testCompile.

 

junit依赖hamcrest-core,所以也要引入后者。

 

public class TestApp {
    @Test
    public void MyTest() {
        ClassPathResource res = new ClassPathResource("spring-config.xml");
        DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
        reader.loadBeanDefinitions(res);
​
        System.out.println(factory.getBean(TestBean.class).getName());
    }
}
TestBean.java:
public class TestBean {
​
    private String name = "hehe";
​
    public TestBean(String name) {
        this.name = name;
    }
​
    public TestBean() {
    }
​
    @Override
    public String toString() {
        return "TestBean{" +
                "name='" + name + '\'' +
                '}';
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
}
spring-config.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">
​
    <bean id="testBean" class="com.gaojx.spring.hello.TestBean"/>
</beans>
 

4.2 踩的坑

4.2.1. 找不到符号 coroutinesutils

build时,提示找不到CoroutinesUtils,解决方法:

在spring-core -> kotlin-coroutines -> src -> main -> kotlin -> org.framework.core -> CoroutinesUtils.kt 上,

右键,Build Module 'spring-kotlin-coroutines.main':

 

4.2.2  No tasks available

运行Run @Test时,提示 No tasks available,

在 File -> settings -> gradle,将下列选项替换成 IntelliJ IDEA:

 

4.2.3. 引入cglib时缺失jar包

构建时,缺失spring-cglib-repack和spring-objenesis-repack,(在spring-core模块下,提示上述两个jar包缺失)。

在gradle选项卡中,spring主项目下,Tasks -> other,双击 cglibRepackJar 和 objenesisRepackJar:

 

此时在项目的settings.gradle中,就可以打开 include "spring-aspects" 了。

 

4.2.4. 找不到org.springframework.aop.target

build时提示:程序包org.springframework.aop.target 不存在。

这个是最最最最最最弱智的失误了!!!!

因为我在Idea的设置中,将名称为target的目录给隐藏了:

 

所以程序一直提示找不到aop下面的target包。

 

 

最终测试成功:

 

 

参考

https://www.cnblogs.com/yjteilz/p/6228833.html

https://blog.csdn.net/Pphu_1220/article/details/104528492

https://www.cnblogs.com/coderxiaohei/p/11628378.html

https://www.cnblogs.com/java-chen-hao/p/11046190.html

https://www.cnblogs.com/coderdxj/p/11437873.html

https://blog.csdn.net/baomw/article/details/83956300

https://blog.csdn.net/yzpbright/article/details/53492458

 

  • 18
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
编译Spring源码并进行Maven测试,你可以按照以下步骤进行操作: 1. 首先,确保你已经正确地配置了Maven环境,并且已经安装了最新版本的Maven。 2. 打开Spring源码的根目录,并到build.gradle文件。 3. 根据引用和引用中的内容,修改build.gradle文件中的repositories部分。将原来的mavenCentral()和maven { url "https://repo.spring.io/libs-spring-framework-build" }保留不变,然后添加一个新的maven配置,如引用所示。这个新的配置将使用阿里云的Maven仓库来下载依赖。 4. 保存并关闭build.gradle文件。 5. 在命令行中进入Spring源码的根目录,并执行以下命令来编译源码和运行Maven测试: ``` mvn clean install ``` 6. Maven将会自动下载所需的依赖,并进行编译测试。这个过程可能会需要一些时间,取决于你的网络速度和电脑性能。 7. 当编译测试完成后,你可以在Spring源码目录的target文件夹中编译后的构建结果。 请注意,编译Spring源码可能需要一些时间和计算资源,特别是在较慢的网络环境下。确保你的电脑满足编译要求,并且有足够的存储空间来存放编译结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Spring源码系列(十三)——Spring源码编译及详细注解](https://blog.csdn.net/zxd1435513775/article/details/124673192)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Spring源码编译测试](https://blog.csdn.net/i_wavelet/article/details/126459704)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值