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:

Spring5 源码编译:环境搭建+测试_第1张图片

 

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

还是找BUILD SUCCESSFUL字样。

 

3.2. 开始构建

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

Spring5 源码编译:环境搭建+测试_第2张图片

 

又是一个漫长的过程。

构建完毕后,找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自己填。

项目结构如下:

Spring5 源码编译:环境搭建+测试_第3张图片

 

在新建的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:


 

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':

Spring5 源码编译:环境搭建+测试_第4张图片

 

4.2.2  No tasks available

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

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

Spring5 源码编译:环境搭建+测试_第5张图片

 

4.2.3. 引入cglib时缺失jar包

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

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

Spring5 源码编译:环境搭建+测试_第6张图片

Spring5 源码编译:环境搭建+测试_第7张图片

 

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

 

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

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

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

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

Spring5 源码编译:环境搭建+测试_第8张图片

 

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

 

 

最终测试成功:

Spring5 源码编译:环境搭建+测试_第9张图片

 

 

参考

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

 

你可能感兴趣的:(JavaEE,java,spring,gradle)