spring源码学习_01 本地环境搭建

news2024/11/25 18:51:33

参考网上各种资源,终于把spring源码运行起来了;步骤总结如下:

spring版本: 5.2.x
本地系统mac
idea 2019.3.2 下载地址:https://www.jetbrains.com/idea/download/other.html
jdk 11 下载地址:https://repo.huaweicloud.com/java/jdk/

1. 前期准备

安装git、gradle;git的安装过程相对简单,这里只说gradle的安装;

在spring的github中可以看到需要安装的gradle的版本:
在这里插入图片描述
下载gradle 5.6.4:https://services.gradle.org/distributions/gradle-5.6.4-bin.zip

下载完毕之后,开始配置环境变量:

vim ~/.bash_profile
export PATH=$PATH:/opt/gradle/gradle-7.5.1/bin
source ~/.bash_profile

2. 下载spring源码

下载地址:https://gitcode.net/mirrors/spring-projects/spring-framework/-/tree/5.2.x/
在这里插入图片描述
下载到本地之后,解压;

3. 导入spring源码

通过File->Open的方式直接导入spring源码;
在这里插入图片描述
导入成功之后,如果未关联git会报如下错误:
org.gradle.process.internal.ExecException: Process ‘command ‘git’’ finished with non-zero exit value 128
操作如下:

git init .
git add .
git commit -am ‘init’
通过以上命令就可以解决;

修改gradle的配置:

  1. build.gradle,增加阿里云镜像库

maven { url “https://maven.aliyun.com/nexus/content/groups/public/” }
maven { url “https://maven.aliyun.com/nexus/content/repositories/jcenter”}

在这里插入图片描述
2. settings.gradle

maven { url “https://maven.aliyun.com/nexus/content/groups/public/” }

在这里插入图片描述
3. gradle.properties

org.gradle.java.home=/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home

在这里插入图片描述

增加VM Options

-Dfile.encoding=UTF-8

在这里插入图片描述

配置好以上,在控制台执行:

./gradlew :spring-oxm:compileTestJava

然后执行;
在这里插入图片描述

4. 验证

创建一个新module spring-demo
在这里插入图片描述
修改gradle名称
在这里插入图片描述
并向gradle中追加:

dependencies {
compile(project(“:spring-context”))
testCompile group: ‘junit’, name: ‘junit’, version: ‘4.12’
}

在这里插入图片描述
编写测试类:

public static void main(String[] args) {
	final AnnotationConfigApplicationContext ann = new AnnotationConfigApplicationContext("com.sxl");
	final Student student = (Student) ann.getBean("student");
	student.say();
}

运行结果:
在这里插入图片描述

5. 遇到的错

  1. org.gradle.process.internal.ExecException: Process ‘command ‘git’’ finished with non-zero exit value 128
    将spring项目添加到git中就解决了;

  2. Error:Kotlin: warnings found and -Werror specified
    两种方式:1
    在这里插入图片描述
    在这里插入图片描述
    如果还是报错,则:
    在这里插入图片描述
    则找到所有的Kotin将其 -Werror去掉;

  3. Error:Kotlin: [Internal Error] java.lang.LinkageError: loader constraint violation: loader org.jetbrains.kotlin.cli.jvm.plugins.PluginURLClassLoader S e l f T h e n P a r e n t U R L C l a s s L o a d e r @ 53832173 ( i n s t a n c e o f o r g . j e t b r a i n s . k o t l i n . c l i . j v m . p l u g i n s . P l u g i n U R L C l a s s L o a d e r SelfThenParentURLClassLoader @53832173 (instance of org.jetbrains.kotlin.cli.jvm.plugins.PluginURLClassLoader SelfThenParentURLClassLoader@53832173(instanceoforg.jetbrains.kotlin.cli.jvm.plugins.PluginURLClassLoaderSelfThenParentURLClassLoader, child of ‘bootstrap’) wants to load interface kotlin.sequences.Sequence. A different interface with the same name was previously loaded by ‘app’ (instance of jdk.internal.loader.ClassLoaders$AppClassLoader).
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
    at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:550)
    at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:458)
    at java.base/java.net.URLClassLoader 1. r u n ( U R L C l a s s L o a d e r . j a v a : 452 ) a t j a v a . b a s e / j a v a . s e c u r i t y . A c c e s s C o n t r o l l e r . d o P r i v i l e g e d ( N a t i v e M e t h o d ) a t j a v a . b a s e / j a v a . n e t . U R L C l a s s L o a d e r . f i n d C l a s s ( U R L C l a s s L o a d e r . j a v a : 451 ) a t o r g . j e t b r a i n s . k o t l i n . c l i . j v m . p l u g i n s . P l u g i n U R L C l a s s L o a d e r 1.run(URLClassLoader.java:452) at java.base/java.security.AccessController.doPrivileged(Native Method) at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:451) at org.jetbrains.kotlin.cli.jvm.plugins.PluginURLClassLoader 1.run(URLClassLoader.java:452)atjava.base/java.security.AccessController.doPrivileged(NativeMethod)atjava.base/java.net.URLClassLoader.findClass(URLClassLoader.java:451)atorg.jetbrains.kotlin.cli.jvm.plugins.PluginURLClassLoaderSelfThenParentURLClassLoader.findClass(PluginURLClassLoader.kt:47)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
    at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:550)
    at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:458)
    at java.base/java.net.URLClassLoader 1. r u n ( U R L C l a s s L o a d e r . j a v a : 452 ) a t j a v a . b a s e / j a v a . s e c u r i t y . A c c e s s C o n t r o l l e r . d o P r i v i l e g e d ( N a t i v e M e t h o d ) a t j a v a . b a s e / j a v a . n e t . U R L C l a s s L o a d e r . f i n d C l a s s ( U R L C l a s s L o a d e r . j a v a : 451 ) a t o r g . j e t b r a i n s . k o t l i n . c l i . j v m . p l u g i n s . P l u g i n U R L C l a s s L o a d e r 1.run(URLClassLoader.java:452) at java.base/java.security.AccessController.doPrivileged(Native Method) at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:451) at org.jetbrains.kotlin.cli.jvm.plugins.PluginURLClassLoader 1.run(URLClassLoader.java:452)atjava.base/java.security.AccessController.doPrivileged(NativeMethod)atjava.base/java.net.URLClassLoader.findClass(URLClassLoader.java:451)atorg.jetbrains.kotlin.cli.jvm.plugins.PluginURLClassLoaderSelfThenParentURLClassLoader.findClass(PluginURLClassLoader.kt:47)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at kotlin.coroutines.experimental.SequenceBuilderKt__SequenceBuilderKt.buildSequence(SequenceBuilder.kt:24)
    at org.jetbrains.kotlin.scripting.compiler.plugin.ScriptiDefinitionsFromClasspathDiscoverySourceKt.discoverScriptTemplatesInClasspath(ScriptiDefinitionsFromClasspathDiscoverySource.kt:53)
    at org.jetbrains.kotlin.scripting.compiler.plugin.ScriptDefinitionsFromClasspathDiscoverySource.(ScriptiDefinitionsFromClasspathDiscoverySource.kt:37)
    at org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationExtension.updateConfiguration(ScriptingCompilerConfigurationExtension.kt:56)

我是通过升级idea版本来解决的,最初是用的2018,升级到了2019解决了该问题;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/534474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【设计模式二十三剑】✨编写更高质量代码的秘诀✨

文章目录 ✨✨简述🎆【万能之门】简单工厂模式(Simple Factory)🎇【制造之剑】工厂方法模式(Factory Method)🎇【生产之剑】抽象工厂模式(Abstract Factory)&#x1f387…

C语言基础知识:函数的调用

函数的定义 一般来说,执行源程序就是执行主函数main,其他函数只能被主函数所调用,而其他函数之间也可以相互调用。 1.标准库函数: 分为:I/O函数,字符串,字符处理函数,数学函数&am…

Go语言的函数和defer用法

目录 函数的基本用法 函数中的变长参数 递归函数(recursion) 函数是“一等公民” 函数中defer的用法 defer的底层原理 使用 defer 跟踪函数的执行过程 defer的注意事项 (1)Go语言内置的函数中哪些可以作为deferred 函数 (2&#xf…

面试code(1)—— 排序算法

算法动画 从小到大排序 1 冒泡排序 被动的将最大值送到最右边 1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 3、针对…

Redis修炼 (17. redis主从集群的数据同步原理 全量同步/增量同步)

数据同步 在一个集群之中 数据同步是很重要的。 redis的集群有多种。 我们这次主要说 主从集群。 全量同步 既然是主从集群 那么肯定是 1个master节点 多个从节点。redis的集群中的第一次同步 我们叫 全量同步: 为什么要强调第一次? 因为如果你是第一…

独家策略大放送:最高年化150%的策略,谁不感兴趣?(含免费版)

上一节我们在沪深300中回测了550中均线交叉策略,有朋友想看看这些策略在沪深300以外的中小市场表现如何,同时大家都非常好奇表现抢眼的老Q自研指标WMA_Q系列到底是怎么计算的。 于是老Q又选择了中证500和创业板指来验证下这些策略是否能有同样的表现(PART 1),顺便在今天的…

流水线中的握手信号笔记

1.《握手信号的打拍(一)》 解释了,为什么在流水线中,握手信号不能简单得加一级寄存器 业界关于流水线级握手信号的标准答案是 skid buffer,此外还有人提到了 Register slice 2.《握手信号的打拍(二)》 为什么简单加一级寄存器会握手失败 &…

抖音SEO系统源码开发搭建/MVC二次开发定制

首先,抖音SEO矩阵系统源码开发,如何做独立部署,首先我们需要深刻理解这个系统的开发逻辑是什么?开发的前言是在抖音平台做流量新增,现在抖音及各大主流短视频平台,流量新增,各大企业需要在短视频…

Redis BigKey

Redis BigKey 一 面试题引入二 MoreKey案例2.1 大批量往redis里面插入2000W测试数据key2.1.1 Linux Bash下执行,插入100W2.1.2 通过redis提供的管道 --pipe命令插入100W大批量数据 2.2 key *2.3 生产上如何限制keys*/flushdb/flushall等危险命令以防止误删误用&…

我们在操作自动化测如何实现用例设计实例

在编写用例之间,笔者再次强调几点编写自动化测试用例的原则: 1、一个脚本是一个完整的场景,从用户登陆操作到用户退出系统关闭浏览器。 2、一个脚本脚本只验证一个功能点,不要试图用户登陆系统后把所有的功能都进行验证再退出系统…

【结构体-位段】

位段 在结构体中&#xff0c;以位为单位的成员&#xff0c;咱们称之为位段(位域)。 struct packed_data{unsigned int a:2;unsigned int b:6;unsigned int c:4;unsigned int d:4;unsigned int i; } data;注意&#xff1a;不能对位段成员取地址。 #include<stdio.h>str…

5.名词复数、动词规则、代词、形容词、副词(不包含不规则)

目录 一、 名词、动词、代词、形容词、副词五种的规则变化。 &#xff08;1&#xff09;名词。 &#xff08;1.1&#xff09;名词复数变化。 &#xff08;1.2&#xff09;名词所有格。 &#xff08;2&#xff09; 动词变化规则。 &#xff08;3&#xff09;代词。 &…

C语言-double和float在内存中的存储方式

本文主要介绍double和float数据类型在C语言中的存储方式 文章目录 double和float存储方式介绍如何存储&#xff1f; double和float存储方式介绍 从存储结构和算法上来讲&#xff0c;double和float是一样的&#xff0c;不一样的地方仅仅是float是32位的&#xff0c;double是64位…

【CAN卡通信的下位机-STM32cubeIDE-hal库+STMF1xx和STMF4xx+数据发送和接收+轮询接收方式+基础样例(1)】

【CAN卡通信的下位机-STM32cubeIDE-hal库数据发送和接收轮询接收方式基础样例1】 1、概述2、实验环境3、自我总结与提升(1)道理学习了一堆&#xff0c;如何使用STM32进行can的收发的话&#xff0c;配置还是挺简单。(2)自己实现了can的收发后&#xff0c;要反过来&#xff0c;补…

shell编程——Here Document免交互与Expect(免交互,高效率)

shell编程——Here Document免交互与Expect&#xff08;免交互&#xff0c;高效率&#xff09; 一、Here Document免交互概述二、Here Document常规用法1、免交互方式实现对行数地统计2、通过read/tee命令接受输入并打印3、通过passwd给用户设置密码4、支持变量替换5、整体赋值…

K8S基础操作之命令篇

目录 第一章.陈述式资源管理 1.1陈述式资源管理方法 1.2.基本命令查看信息 1.3.K8S管理操作分为2大类 1.4.数据网络端口访问流程 第二章.基本信息查看 2.1.命令格式 2.2.命令 2.3.项目的生命周期 第三章.service 3.1.概述 3.2.service 的 type 类型 3.3 headless …

神级指标DMI魔改免费公开!在宽基指数上也可以收获40倍收益,每年都在创新高!

一、写在前头 今天,我们要讲的DMI实际上是一组指标,它由表示多空方向的PDI、MDI以及表示趋势强度的ADX、ADXR共四条线组成。在正式开讲之前,我们先聊几句近期的行情。 上周我们根据量化策略提示了一些板块的机会,其中有一些已经开始有所表现。比如今天涨幅前十的板块中,…

【python笔记】可变对象和不可变对象

前言 在python中&#xff0c;一切事物皆是对象&#xff0c;变量是对象在内存中的存储和地址的抽象。类型也是属于对象的&#xff0c;而不是变量。变量和对象是分离的&#xff0c;对象是内存中储存数据的实体&#xff0c;变量则是指向对象的指针。 “”(赋值号)是将右侧对象的内…

网络编程与netty

目录 NIO 网络编程Buffer&#xff08;缓冲区&#xff09;Channel&#xff08;通道&#xff09;Selector&#xff08;选择器&#xff09;SelectionKey 零拷贝原生NIO存在的问题 线程模型传统阻塞 I/O 服务模型Reactor 模式单 Reactor 单线程单 Reactor 多线程主从 Reactor 多线程…

RabbitMQ养成记 (3.MQ的简单工作模式 和 Pub/sub 订阅模式)

上一篇是一个简单的helloworld。 我们直接发直接收 这种是最简单的。 下面我们再来接触更加复杂一点&#xff1a; 简单工作模式 work queues 工作队列模式&#xff1a; 这里注意 这里的消息 对两个消费者 c1 c2来说是竞争关系 而不是等份分发关系&#xff0c; 就像两个线程…