如何调试 Java 开源项目源码,记一种源码导入开发工具并调试的通用方法
楔子
说起读开源项目源码,很多朋友觉得高大上、大佬牛逼,云云~
挡在很多人面前的不是源码怎么读,而是不知道如何导入源码到开发工具以及如何调试源码。
本文将以 spring-cloud-gateway 源码导入一个简单的 SpringBoot 项目中举例,目的就是给读者一个导入开源项目源码并调试的简单方法。
看文过程中感觉有不明白的地方欢迎评论留言,如果本文帮到了你,本人不胜荣幸的同时,也欢迎为本文点个大拇哥
准备工作
1、默认大家本地有装 IDEA、Maven、Git,Java 程序员通识就不再细述。
2、下载源码 https://github.com/spring-cloud/spring-cloud-gateway.git
3、切换 tag 创建分支 v3.0.2

本例中切换分支有其原因:根据BOM
spring-cloud-dependencies-parent中定义的版本对应的仓库tag 正是v3.0.2
4、使用 https://start.spring.io/ 初始化一个demo,引入 spring-cloud-starter-gateway依赖,使用Java 8,项目名等其他信息默认


点击 GENERATE 下载生成的代码压缩包,解压到自己的目录

5、目前 demo 与 spring-cloud-gateway 源码都放到了 ~/WorkSpace/gitRepo 目录下了。
接下来,开始导入项目与源码
导入项目与源码
1、导入demo工程

给出一下demo的pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2020.0.2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2、检查 gateway 相关依赖是否引入

直接输入关键字,搜索 gateway,查看是否有gateway相关依赖,这是我们一般引Maven依赖的方式。

3、引入 spring-cloud-gateway 源码工程

使用 spring-cloud-gateway 下的pom.xml 引入项目

等待依赖拉取完成,如下图所示

验证
1、验证External Libraries 下是否仍有 spring-cloud-starter-gateway 依赖
直接用搜索关键字来查

2、修改 spring-cloud-gateway 子工程源码,测试demo是否使用spring-cloud-gateway源码工程

把demo工程run起来,什么也不需要配置,直接看日志输出

如上图,当前依赖的是源码了,可以放心的加注释与Debug了。
原理
这个方法是利用了Maven依赖搜索顺序做到的。
源码依赖 > 本地仓库依赖 > 远程仓库依赖
ps:Gradle也是类似的
详细解释就是引入 spring-cloud-gateway 的 pom.xml时,会连带着将其子工程均依赖到当前工作空间中,对于 Maven 而言,这几个子工程的pom.xml是它首先要搜索的地方,这些pom.xml正是定义坐标的地方。
当Maven按demo工程的pom找坐标时,会按下图的坐标到所有引进来的工程中先找上一波
当找到spring-cloud-gateway源码工程时,发现还有子工程,再到子工程找一遍

找到 spring-cloud-starter-gateway 工程的pom.xml时,就会将其源码依赖进来

由于SpringBoot 和 SpringCloud 的 Starter 都是虚包,spring-cloud-starter-gateway 会把其他相关依赖引到项目中。
后话
写这篇文章做个记录,希望能帮到有需要的人,如果本文对你有所启发,点个推荐再走呗~
我是 Hellxz,一个Java/Vue/K8s/DevOps等集多功能于一身的软件工程师!
细水长流,我们下次再见,peace~
本文同步发布于我的CSDN博客 https://blog.csdn.net/u012586326?spm=1001.2101.3001.5343
如何调试 Java 开源项目源码,记一种源码导入开发工具并调试的通用方法的更多相关文章
- Android 开源项目源码解析(第二期)
Android 开源项目源码解析(第二期) 阅读目录 android-Ultra-Pull-To-Refresh 源码解析 DynamicLoadApk 源码解析 NineOldAnimations ...
- Java开源项目(备查)
转自:http://www.blogjava.net/Carter0618/archive/2008/08/11/221222.html Spring Framework [Java开源 J2EE框 ...
- 网上下载的 java开源项目 如何 打jar包
目前很多java开源项目(例如qlexpress)只提供了源码,没有提供jar,下面提供maven打jar包的方法. 1.进入qlexpress下载后源代码所在的目录,此目录应包含pom.xml,如下 ...
- 用Java开源项目JOONE实现人工智能编程
http://www.robotsky.com/ZhiN/MoS/2011-08-25/13142461416649.html 用Java开源项目JOONE实现人工智能编程 https://sourc ...
- 硬核! Github上 ,star超高的Java 开源项目分享给你!
Awsome JavaGreat Java project on Github(Github 上非常棒的 Java 开源项目). English Version 大家都知道 Github 是一个程序员 ...
- 【我整理的java开源项目】
摘要: 1. 整理出一些使用比较广或者个人觉得比较好的java开源项目和资料供参考. 2. 如果你觉得好但是我没有列出的开源项目请告诉我,方便我添加到列表里. 3. 如果你发现信息描述有误请联系我,我 ...
- 阿里巴巴的26款Java开源项目
阿里巴巴的26款Java开源项目 开源展示了人类共同协作,成果分享的魅力.没有任何一家网络公司可以不使用开源技术,仅靠自身技术发展起来.“取之于开源,用之于开源,才能促进开源的良性发展”,阿里巴巴各个 ...
- 3月份GitHub上最热门的Java开源项目
今天,我们来盘点3月份GitHub上最热门的Java项目的时候了,如果你每月都有关注猿妹发布的排行榜,那么本月的Java项目对你来说一定不陌生,这些都是曾经多次出现在榜单中的项目: 1 advance ...
- 硬核! 逛了4年Github ,一口气把我收藏的 Java 开源项目分享给你!
Awsome Java Great Java project on Github(Github 上非常棒的 Java 开源项目). English Version 大家都知道 Github 是一个程序 ...
随机推荐
- js 如何取消promise
1: 使用reject function hello() { let _res, _rej: any; const promise = new Promise((res, rej) => { _ ...
- 【函数分享】每日PHP函数分享(2021-2-19)
array_diff_uassoc - 用用户提供的回调函数做索引检查来计算数组的差集 说明 array_diff_uassoc ( array $array1 , array $array2 , a ...
- 在多线程编程中不要使用sleep()、usleep()函数
这两个函数是非线程安全的,可能会造成程序卡死. 对于c++程序,建议使用std::this_thread::sleep_for()和std::this_thread::yield()代替. 纯c程序可 ...
- 用一次就会爱上的cli工具开发
本文转载自用一次就会爱上的cli工具开发 写在前面 最近接手任务--使用nodejs开发一个公司内部使用的cli工具,简而言之就是输入一行命令快速搭建好项目结构,也可以通过不同的命令引入不同的文件. ...
- 力扣1438. 绝对差不超过限制的最长连续子数组-C语言实现-中等难度
题目 传送门 文本 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit . 如果不存在满足条 ...
- dpi dp px 换算关系
getResources().getDisplayMetrics().densityDpi 就是屏幕密度.getResources().getDisplayMetrics().density 也可以理 ...
- 基于μcOS-II实时操作系统源码实现RMS和EDF调度(共享资源)
μcOS-II多任务实验报告(RMS.EDF调度) 目录 μcOS-II多任务实验报告(RMS.EDF调度) 一.实验概述 二.环境搭建 三.代码分析 四.实验步骤 1 给TCB块添加扩展 2 创建并 ...
- docker ssh秘钥免密登录
一.概述 有一台跳板机,已经实现了免密登录后端服务器.但是我写了一个django项目,它是运行在容器中的,也需要免密登录后端服务器. 虽然可以在容器中手动做一下免密登录,但是容器重启之后,之前做的设置 ...
- 一些 html+css 细节
一. input 光标(插入符)颜色 input: { caret-color: #c0c0ff; } 二. 修改 placeholder 颜色 input::placeholder { color: ...
- POJ-1860(最短路问题,Bellman-Ford算法判正圈)
Currency Exchange POJ-1860 这题其实是最短路问题的变形,但是这里不用求解最短路,而是求解路径中是否存在正圈.如果存在正圈则说明兑换后的货币可以一直增加,否则不能实现通过货币转 ...