• 【Spring】Spring源码编译


    环境准备

    • 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项目

      参考:【Gradle】maven-publish插件的使用

       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
    //                 }
    //                ......
    //             }
    
            }
        }
    }
  • 相关阅读:
    009——数组(九) each list array_map array_walk array_walk_recursive
    008——数组(八)删除添加数组 得到数组键名键值
    laravel怎么获取到public路径
    laravel中composer镜像服务的方式
    logback的使用和logback.xml详解
    log4j-over-slf4j工作原理详解
    java
    【Log】logback指定配置文件(二)
    logback 中文手册
    logback logback.xml常用配置详解(三) <filter>
  • 原文地址:https://www.cnblogs.com/h--d/p/14737541.html
Copyright © 2020-2023  润新知