如何調試 Java 開源項目源碼,記一種源碼導入開發工具並調試的通用方法

楔子

說起讀開源項目源碼,很多朋友覺得高大上、大佬牛逼,云云~

擋在很多人面前的不是源碼怎麼讀,而是不知道如何導入源碼到開發工具以及如何調試源碼。

本文將以 spring-cloud-gateway 源碼導入一個簡單的 SpringBoot 項目中舉例,目的就是給讀者一個導入開源項目源碼並調試的簡單方法。

看文過程中感覺有不明白的地方歡迎評論留言,如果本文幫到了你,本人不勝榮幸的同時,也歡迎為本文點個大拇哥 😅

準備工作

1、默認大家本地有裝 IDEA、Maven、Git,Java 程式設計師通識就不再細述。

2、下載源碼 //github.com/spring-cloud/spring-cloud-gateway.git

3、切換 tag 創建分支 v3.0.2

本例中切換分支有其原因:根據BOM spring-cloud-dependencies-parent 中定義的版本對應的倉庫tag 正是v3.0.2

4、使用 //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="//maven.apache.org/POM/4.0.0" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //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部落格 //blog.csdn.net/u012586326?spm=1001.2101.3001.5343