在一心想要学习Spring框架源码时,我们会遇到很多麻烦的问题。开始本文前,你只需要拥有一个装好IDEA的Ubuntu系统就可以愉快启程了。如果还没有IDEA,可以参考在Ubuntu上安装Intellij IDEA并创建桌面快捷方式,至于GitGradleJava 可以选择事先安装好,也可以跟随本文在遇到对应问题时再安装。

环境信息

项目 版本号 是否需要提前安装好
Ubuntu 18.04 LTS
Intellij IDEA 2019.1.3
Git 2.17.1
Gradle 5.5
Java 1.8

一、我们直奔主题Git源码:



URL:https://github.com/spring-projects/spring-framework.git

问题1:Cannot Run Git

解决方案:如何在Ubuntu系统上安装Git

方案选择及理由:我选择了使用默认包安装Git(且我没有做设置Git的操作),因为我搭建的主要目标是上手一套源码阅读环境,所以快捷的方式更好。以下是指令:

sudo apt update
sudo apt install git



第一次执行时出现这个报错,且sudo apt update执行过程中也有一些更新失败的报错。后来休息了一段时间我又重新回来做的,第二次用的是apt-get

sudo apt-get update
sudo apt install git

执行完成后重启IDEA,就可以Git spring-framework代码了

网上Ubuntu安装Git的文章中apt和apt-get指令都有,那有什么区别呢?

参考这篇文章Linux中apt与apt-get命令的区别与解释

* 简单补充几点:

  • apt 命令是在Ubuntu 16.04 引入的。
  • apt-get 虽然没被弃用,但作为普通用户,还是应该首先使用 apt
  • apt和apt-get命令之间的区别:
apt 命令 取代的命令 命令的功能
apt install apt-get install 安装软件包
apt remove apt-get remove 移除软件包
apt purge apt-get purge 移除软件包及配置文件
apt update apt-get update 刷新存储库索引
apt upgrade apt-get upgrade 升级所有可升级的软件包
apt autoremove apt-get autoremove 自动删除不需要的包
apt full-upgrade apt-get dist-upgrade 在升级软件包时自动处理依赖关系
apt search apt-cache search 搜索应用程序
apt show apt-cache show 显示装细节

问题2:clone git慢

解决方案1:git clone速度太慢的解决办法

解决方案2(更推荐):

如果像我一样只是为了读spring源码,Gitee码云上有个快速的git地址



使用以下地址:

https://gitee.com/mirrors/Spring-Framework.git

代替

https://github.com/spring-projects/spring-framework.git

Directory我仍然使用的是/spring-framework(而没用/Spring-Framework),是因为可以接着之前Github的下载结果继续git

二、导入项目到IDEA

我们已经有一个项目在~/IdeaProjects/spring-framework下了,但是在打开项目时再次遇到问题:

问题3:Please, set the Gradle JVM option

解决方案:安装JDK1.8!Ubuntu18.04 安装Jdk1.8

官网下载JDK都要Oracle账号单点登录了,经常要下JDK的还是建议注册一个Oracle账号

问题4:官网下载JDK慢

有时候,下载个JDK要6个多小时,这谁顶得住啊?

解决方案:参考博客# JDK下载过慢的问题解决方案

华为镜像:https://repo.huaweicloud.com/java/jdk/

修改环境变量的时候用以下指令解决权限问题:

sudo su
vi /etc/profile

打开vi编辑器之后,G跳到文档底部,按i进入插入模式,并从光标当前位置开始输入;按a进入插入模式,从目前光标所在位置的下一个位置开始输入文字;

o进入插入模式,并插入新的一行,从行首开始输入文字。

x删除字符,最后按ESC并输入:qw保存离开

source /etc/profile
java -version

*简单讲一下文件校验:

我下载的是https://repo.huaweicloud.com/java/jdk/8u202-b08/ 中的jdk-8u202-linux-x64.tar.gz

oracle官网checksum:

https://www.oracle.com/webfolder/s/digest/8u202checksum.html

FileName CheckSum
jdk-8u202-linux-x64.tar.gz sha256: 9a5c32411a6a06e22b69c495b7975034409fa1652d03aeb8eb5b6f59fd4594e0
md5: 0029351f7a946f6c05b582100c7d45b7

获取本地文件摘要的Shell指令:

sha256sum <filename>
md5sum <filename>

两者一校对,没毛病

安装好JDK后之后还没完:

  1. 选择Welcome to IntelliJ IDEA的右下角Configure->Structure for New Projects

  2. 点击New..选择刚才安装的JDK目录,例如我的/usr/local/jdk1.8.0

  3. 重新打开之前Git下来的源码

三、迫不及待开始编译源码:

问题5: spring源码编译需要gradle

解决方案:自己手动下载Gradle

cd /usr/local
sudo mkdir gradle
sudo unzip -d /usr/local/gradle ~/下载/gradle-5.5-bin.zip

这里为啥要建一个gradle文件夹呢?因为开发时常常会用到多个不同版本gradle,所以建个gradle放所有gradle文件

  • 3.配置环境变量
sudo su
vi /etc/profile



使环境变量生效

source /etc/profile
  • 4.验证
gradle -v
  • 5.配置IDEA GRADLE_HOME

    选择IDEA-File-Settings,打开设置,然后搜索gradle,

    选择Use local Gradle distribution,输入Gradle home:

    /usr/local/gradle/gradle-5.5

  • 6.再次尝试编译spring源码

    可以直接点击小锤子,或者点击Build-Build Project

问题6: gradle下载依赖慢

解决方案:参考这篇博客Gradle配置解决下载速度慢问题

  • 1.对Gradle进行全局的设置
cd ~/.gradle/
touch init.gradle
vi init.gradle

  • 2.init.gradle中的内容:
allprojects{
repositories {
def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/'
all { ArtifactRepository repo ->
if(repo instanceof MavenArtifactRepository){
def url = repo.url.toString()
if (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/') || url.startsWith('https://repo.maven.apache.org') || url.startsWith('https://repo.spring.io')) {
remove repo
}
}
}
maven {
url REPOSITORY_URL
}
}
}

配置之后改为从aliyun下载了,这样就说明成功了

如果不是从maven.aliyun.com下载还是从repo.spring.io或者repo.maven.apache.org下载,可能init.gradle还有些问题,比如https误写成http等,建议立即停止build,修改init.gradle之后重新build。另外,整个build过程可能还有点耗时,但是至少Download时不会卡住了。

问题7:cglib和objenesis的编译错误


报错模块:spring-core


报错示例:

你可能是程序包org.springframework.cglib.core或者org.springframework.cglib.proxy中的类找不到符号

,比如org/springframework/cglib/proxy/MethodProxy.java文件报错,如下图:



也可能是程序包org.springframework.objenesis中的类找不到符号,又或者是org/springframework/objenesis/SpringObjenesis.java文件报错,如下图:

报错原因:

其实官方对于这个错误早有提示,只是咱们一直没注意而已:

你也可以选择看这篇摘抄,也可以直接读源码中的文件

https://www.cnblogs.com/zaid/articles/11147818.html

解决方案:

  • 官方说得很简单,于是我就在IDEA的Terminal中尝试:

  • 但是我们又遇到新的问题JAVA_HOME is not set and no 'java' command could be found in your PATH.

  • 这个错误主要是说没有配置Java环境变量,那我就直接执行以下source /etc/profile

  • 又遇到一个问题,执行gradlew就开始下载gradle,参考博客:gradlew和gradle的区别,以下是我个人的解决步骤:

  • 1.把之前下载的gradle-5.5-bin.zip压缩包拷贝到项目的gradle/wrapper目录下。

cp ~/下载/gradle-5.5-bin.zip gradle/wrapper
  • 2.修改spring-framework/gradle/wrapper/gradle-wrapper.properties中的distributionUrl=gradle-5.5-bin.zip,如下图:

  • 3.再次执行./gradlew :spring-oxm:compileTestJava(注意:你们输入是用英文:代替我这里输入的中文冒号)

问题8:AspectJ编译问题


报错模块:spring-aspects


报错示例:

报错文件org/springframework/transaction/aspectj/AspectjTransactionManagementConfiguration.java,找不到类AnnotationTransactionAspect,如下图

解决方案

cd ~/下载/
source /etc/profile
java -jar aspectj-1.9.4.jar

然后就打开了一个安装交互界面,我全点的Next,最后完成时有推荐去做的事,如下图(我们在4.配置环境变量中完成)

  • 3.配置Aspectj环境变量

    如图所示

  • 4.为spring-apspect工程添加Facets属性

  • 4.1 打开File -> Project Structure..

  • 4.2 Facets新增AspectJ

  • 4.3 选中spring-aspects_main

  • 4.4 移除Modules中spring-aspects/main下的Kotlin只留下AspectJ

  • 4.5 更改编译器:

    搜索Java Compiler,切换Use Compiler由JavaAjc,Path to Ajc Compiler填写/home/zaid/aspectj1.9/aspectjtools.jar,选中Delegate to Javac

四、新建测试Module

  1. File->New Module..
  2. Gradle->Java

  3. 作为spring的module,并随便取个artifactId,比如helloworld

  4. 打开helloworld/build.gradle,添加依赖工程

  5. 在helloworld/src/main/java下创建第一个Java类MyTestBean

  6. 右击helloword/src/main/resources->New->XML Configuration File->Spring Config

  7. 编辑helloword/src/main/resources/beanFactoryTest.xml

  8. 在helloword/src/test/java创建BeanFactoryTest
public class BeanFactoryTest {
@Test
public void testSimpleLoad() {
BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanFactoryTest.xml"));
MyTestBean bean = (MyTestBean) bf.getBean("myTestBean");
assertEquals("testStr", bean.getTestStr());
}
}

总结

至此,我们成功的在Ubuntu上搭建了Spring源码的测试环境,并且可以Debug跟踪源码了。之后会深入分析Spring源码,写出自己的感悟心得,有兴趣的朋友,咱们一起加油

Ubuntu搭建Spring源码环境常见问题的更多相关文章

  1. 基于Eclipse搭建Hadoop源码环境

    Hadoop使用ant+ivy组织工程,无法直接导入Eclipse中.本文将介绍如何基于Eclipse搭建Hadoop源码环境. 准备工作 本文使用的操作系统为CentOS.需要的软件版本:hadoo ...

  2. 【一步一步】Spring 源码环境搭建

    平时项目中基本上都会用到spring,但是源码还没有深入的了解过.趁这段时间稍微空闲点,开始研究下spring 源码.下面是spring 源码的环境搭建. 主要分为如下步骤: ①安装jdk,gradl ...

  3. Dive into Spring framework -- 搭建spring 源码的开发环境

    spring是一个类之间依赖的管理容器,大家都知道,但我们中很多人都仅仅停留在使用的层面,但spring本身具有极大的研究价值,所以在使用了几年spring之后,还是想深入的探究一下其根源.记录于此, ...

  4. 搭建 Spring 源码阅读环境

    前言 有一个Spring源码阅读环境是学习Spring的基础.笔者借鉴了网上很多搭建环境的方法,也尝试了很多,接下来总结两种个人认为比较简便实用的方法.读者可根据自己的需要自行选择. 方法一:搭建基础 ...

  5. Spring源码分析_01_ idea搭建spring源码阅读环境

    二.参考资料 1.Intellij Idea如何导入spring源码

  6. Spring源码环境搭建

    Spring源码在github上,地址是https://github.com/spring-projects/spring-framework/,选择5.3.x版本,直接从github上克隆项目网速很 ...

  7. windows下IntelliJ IDEA搭建kafka源码环境

    于kafka核心原理的资料,网上有很多,但是如果不自己研究其源码,永远是知其然而不知所以然.下面就来演示如何在windows环境下来编译kafka源码,并通过IntelliJ IDEA开发工具搭建ka ...

  8. 使用IntelliJ IDEA搭建kafka源码环境时遇到Output path错误解决办法

    kafka源码环境搭建好之后,需要在IntelliJ IDEA开发工具中以debug方式启动kafka服务器来测试消息的生产和消费. 但是在启动kafka.Kafka类中的main方法(也就是运行 k ...

  9. 《Java Spring框架》基于IDEA搭建Spring源码

    第一步: IDEA :IntelliJ IDEA 2018.1.4    :JDK安装(必须1.8或者以上),IDEA安装(过程省略). 第二步: Gradle:下载地址:https://servic ...

随机推荐

  1. python_面向对象——对象之间的关联关系

    1.将类中的对象关联起来(简单的方法) class Person: def __init__(self,name,age,sex): self.name = name self.age = age s ...

  2. Lua 学习之基础篇七<Lua Module,Package介绍>

    Lua 之Module介绍 包管理库提供了从 Lua 中加载模块的基础库. 只有一个导出函数直接放在全局环境中: [require]. 所有其它的部分都导出在表 package 中. require ...

  3. 深入了解jQuery之链式结构

    本文是在阅读了Aaron艾伦的jQuery源码解析(地址:http://www.imooc.com/learn/172)后的个人体会以及笔记.在这里感谢艾伦老师深入浅出的讲解!! 1 什么是链式? 先 ...

  4. .net 后台给html控件赋值

    接上篇,上篇中每个专业的名称是写死的,如何动态获取数据库中的值,同时对其他代码产生最小影响呢? 前台代码 <div " id="div1" runat=" ...

  5. [HNOI2009] 有趣的数列——卡特兰数与杨表

    [HNOI 2009] 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足a1<a3<…&l ...

  6. C# 安全性

    一.标识和Principal static void Main(string[] args) { AppDomain.CurrentDomain.SetPrincipalPolicy(System.S ...

  7. C# Dynamic动态对象

    1.ExpandoObject dynamic expObj = new ExpandoObject(); expObj.FirstName = "Daffy"; expObj.L ...

  8. Windows服务启动时候报错1053

    用.net 开发了一个C#语言的windows服务,在本地和测试环境,安装启动都正常,在新的线上环境报错,不能启动-报出-错误1053:服务没有及时响应启动或控制请求. 后来发现时线上.NET FRA ...

  9. 第八章 用SQL语句操作数据

    --切换数据库:手动切换和命令切换 use MySchool --向Student表中插入数据 --语法:INSERT [INTO] 表名 (列名) VALUES (值列表) --注意事项: --1. ...

  10. [USACO17JAN] 晋升者计数 dfs序+树状数组

    [USACO17JAN] 晋升者计数 dfs序+树状数组 题面 洛谷P3605 题意:一棵有点权的树,找出树中所有\((u,v)\)的对数,其中\(u,v\)满足\(val(u)\le val(v)\ ...