【Java經驗分享篇01】小白如何開始學會看開源項目?
前言
本文章純粹是個人對於一個新手如何在有一定基礎的情況下開始看自己的第一個開源項目做一定的解析。所以選用的是技術架構並不難的項目,對於新手來說也更加友好,純屬分享希望對於已經有一定程式碼基礎的小夥伴們有用!
1.理解開源
1.1.什麼是開源?
一般來說,如果提及開源,人們首先想到的是,把程式碼公開出去,例如放到GitHub上。以下詳細來聊聊開源這個概念的內含和外延,來快速的了解關於開源的概念以及延伸,關於開源的最權威解釋可以參考 //opensource.org ,這個網站是開源思想誕生的地方。而在中國也同樣有 開源中國這樣的開源網站
中國外開源社區推薦:開源中國、ChinaUnix、GitHub、Apache、SourceForge、
1.2.開源的定義
先來給開源一個定義,一個軟體是開源的,最基本的含義是程式碼是公開的,任何人都可以去查看,修改以及使用。
首先,開源程式碼和閉源程式碼非常不同。閉源程式碼就是普通的商業版權軟體,程式碼是封閉的,只有作者才能看到,出了問題也只有他能修改。而開源程式碼,任何人都可以查看和修改。關於開源思想的誕生,有一個很有意思的故事。Richard Stallman 是有史以來最偉大的幾名黑客之一,也是世界上寫程式碼最多的人之一,他曾經買過一個商業軟體,結果有一點小問題,於是他去找軟體公司,問他們能不能幫忙修復一下,軟體公司說不行,Richard 於是說,那能不能把程式碼給我,我來修復一下,公司也說不行。於是 Richard Stallman 很生氣,創立了自由軟體基金會,發布了大名鼎鼎的 GPL 協議,GPL 至今為止依然是最著名的開源協議。
第二點需要特別注意的是,開源不等於免費。軟體程式碼雖然可以免費給別人,但是軟體相關的服務,例如編譯維護升級等,一樣可以賺錢,例如 Redhat 就是家開源軟體公司,不僅僅賺錢,而且很賺錢。同時,很多公司有把越來越多的開發者投入到公司的開源項目中,這些軟體可以有力的支撐起公司的生態,所以如果你是一個開源軟體開發者,也不用擔心找不到工作。
1.2.1.開源軟體優點
| 優點 | 說明 |
|---|---|
| 低風險 | 使用閉源軟體無疑是把命運交給他人,一旦封閉的源程式碼沒有人來維護,你將進退維谷;而且相較於商業軟體公司,開源社區很少存在倒閉的問題。 |
| 高品質 | 相較於閉源軟體產品,開源項目通常是由開源社區來研發及維護的,參與編寫、維護、測試的用戶量眾多,一般的 bug 還沒有等爆發就已經被修補。 |
| 低成本 | 開源工作者都是在幕後默默且無償地付出勞動成果,為美好的世界貢獻一份力量,因此使用開源社區推動的軟體項目可以節省大量的人力、物力和財力。 |
| 更透明 | 沒有哪個笨蛋會把木馬、後門等放到開放的源程式碼中,這樣無疑是把自己的罪行暴露在陽光之下。 |
1.2.2.經典開源軟體案例
| 軟體 | 說明 |
|---|---|
| Linux | Linux 是一款開源的作業系統,它的內核由多名極客共同維護。Linux 是開源軟體的經典之作、代表之作、巔峰之作。 |
| Apache | 世界使用排名第一的 Web 伺服器軟體。 |
| MySQL | 世界上最流行的關係型資料庫,適合中小型網站。 |
| Firefox | 火狐瀏覽器。在 Chrome 推出之前,Firefox 幾乎是最快速的瀏覽器,直到現在也是 Web 開發人員的調試利器。 |
| OpenOffice | 套跨平台的辦公軟體套件,類似 Microsoft Office。 |
| GCC | C語言/C++編譯器。 |
| Java、PHP、 Python | 開源的程式語言。 |
1.3.關於開源協議
開源軟體在追求「自由」的同時,不能犧牲程式設計師的利益,否則將會影響程式設計師的創造激情,因此世界上現在有 60 多種被開源促進組織(Open Source Initiative)認可的開源許可協議來保證開源工作者的權益。
開源協議規定了你在使用開源軟體時的權利和責任,也就是規定了你可以做什麼,不可以做什麼。
1.3.1.如何選擇開源協議
世界上的開源協議有上百種,很少有人能徹底搞清它們之間的區別,即使在最流行的六種開源協議——GPL、BSD、MIT、Mozilla、Apache 和 LGPL——之中做選擇,也很複雜。
烏克蘭程式設計師 Paul Bagwell 畫了一張分析圖,說明應該怎麼選擇開源協議,大家看了一目了然,真是清爽。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iQKFVvVg-1627583726689)(img/1.gif)]](http://img-blog.csdnimg.cn/47bf416251c349938930d1c217694ec5.gif)
2.如何查找開源項目
首先關於開源項目的查找要介紹的網站有兩個,一個是 GitHub眾所周知全球最大的同性交友平台,第二個則是中國近幾年火熱的程式碼管理平台 碼雲。想要尋找比較好的開源項目通常在這兩個平台上面搜索即可,當然搜索也是需要技巧的。
程式碼管理平台常見關鍵字解析
watch:會持續收到項目的動態fork:複製某個項目到自己的倉庫star:點贊數,表示對該項目表示認可,點贊數越多的項目一般越火clone:將項目下載到本地follow:關注你感興趣的作者,會收到他們的動態
2.1.一個倉庫項目的基本解析

一些關鍵性資訊分析
Issues(問題單):用於對項目進行跟蹤、增強和排錯。它們就像電子郵件一樣 —— 除了它們可以與團隊的其他成員進行分享和討論- 越火的項目
start和fork就會越多 commit:一般比較好的項目,維護會比較頻繁,更新也會頻繁,提交數就會多README.md文件是一個項目的入門手冊,裡面介紹了整個項目的使用、功能等等。所以README文件寫得好不好,關係到這個項目能不能更容易的被其他人了解和使用- 也可以根據項目的最後更新時間來檢驗自己是否下載了遠古項目
2.2.關於開源項目高級搜索
GitHub有高級搜索功能,search/advanced可以輸入關鍵字、程式碼庫大小、包含作者、程式碼語、程式碼包含後綴文件名等

注意:搜索公式可以結合使用。每個公式之間用空格隔開即可!
2.3.根據倉庫標題、描述搜索
in關鍵詞限制搜索範圍
in:name xxx項目名包含xxxin:description xxx項目描述包含xxxin:readme xxx項目介紹文檔里含有xxx
以in:限制 搜索的具體內容為主導進行更加精準的搜索
2.4.按照地區和語言進行搜索
很多時候我們的項目是要用我們會的語言,你找到了一個Python寫的好項目,但是沒學過Python,下載了也看不懂,同時,為了更好的閱讀README.md幫助文檔以及項目注釋,我想很多同學都會想要下載中文的項目,當然英語頂呱呱的請忽略。這個時候就可以用地區和語言進行搜索。
location:地區language:語言
#語言為javaScript
language:javaScript
#地區為china
location: China
#可以進行聯合搜索 如下:
language:javascript location:china
2.5.根據倉庫屬性條件搜索
可以根據個人需求,可能想要找的項目並不是那麼大的項目只是一些小項目就可以對項目大小進行限制。
size:>= 數字注意:100代表100Kb 單位為Kb
如果想要尋找一些比較新穎的項目,不想要比較遠古的項目則可以根據項目的更新時間來搜索
pushed:> YYYY-MM-DD最後上傳日期大於YYYY-MM-DDcreated:> YYYY-MM-DD創建日期大於YYYY-MM-DD
#比如我們想要尋找2020年最新更新的項目,可以如下
pushed:>2020-01-03 Spring Boot
#這樣子就可以找到2020年1月之後更新的最新項目
2.6.根據個人或某組織進行搜索
如果你想在GitHub 上找一下某個大神是不是提交了新的項目,可以對他們進行精準搜索
user: name查找某個用戶org: name查找某個組織followers:>=xxx查找關注者數量超過xxx的開發者
2.7.根據倉庫的LICENSE搜索
開源項目的License(項目授權協議) 有的開源項目作者明確禁止商用了,但是你不知情下載了,並且使用了,這就會很麻煩,所以如果有搜索需要項目的時候就需要按照對應的開源協議來搜索項目。
license:對應協議
#例如咱們要找協議是最為寬鬆的 Apache License 2 的程式碼,如下
license:apache-2.0 Spring Boot
awesome加強搜索
Awesome 似乎已經成為不少 GitHub 項目喜愛的命名之一,Awesome 往往整合了大量的同一領域的資料,讓大家可以更好的學習
awesome 關鍵字awesome 系列一般是用來收集學習、工具、書籍類相關的項目
比如搜索優秀的Java相關的項目,包括框架、教程等可以輸入:awesome Java
2.8.熱門
GitHub Trend 頁面總結了每天/每周/每月周期的熱門Repositories 和 Developers,你可以看到在某個周期處於熱門狀態的開發項目和開發者。

GitHub Topic 展示了最新和最流行的討論主題,在這裡你不僅能夠看到開發項目,還能看到更多非開發技術的討論主題

3.開源項目解析
3.1.查找相關開源項目
根據用戶使用情況不同(中文Gitee,全球性GitHub),可以先從中國的開源網站來尋找開源項目,以下開源項目案例來自於 Gitee,在Gitee中可以根據首頁的開源軟體對最有價值的項目進行查看和搜索。或者可以根據推薦項目進行觀察和選擇項目學習

3.1.1.開源項目
本次開源項目來源於Gitee上的一個自動化OA辦公系統。感謝大佬的開源,如果大家喜歡也可以給大佬一個start哦。辦公自動化(OA)是面向組織的日常運作和管理,員工及管理者使用頻率最高的應用系統,極大提高公司的辦公效率。

3.2.如何分析一個開源項目
3.2.1.觀察開源項目
首先針對於一個開源項目,要做的第一件事情應該是先觀察這個開源項目的大致結構(如使用說明文檔、sql文件、項目目錄結構maven或者gradle等),以及所使用的語言等基本資訊。

3.2.2.項目技術分析
查看說明文檔-匹配技術棧與運行環境
根據開源項目的使用說明文檔可以知道當前項目使用的是哪些技術棧,根據這些技術棧來分析是否符合自己的需求。並且查看當前項目的運行環境要求,以便進行下一步將項目運行起來。
以當前開源案例為說明技術棧如下:
前端技術
| 技術 | 名稱 | 版本 | 官網 |
|---|---|---|---|
| freemarker | 模板引擎 | springboot1.5.6.RELEASE集成版本 | //freemarker.apache.org/ |
| Bootstrap | 前端UI框架 | 3.3.7 | //www.bootcss.com/ |
| Jquery | 快速的JavaScript框架 | 1.11.3 | //jquery.com/ |
| kindeditor | HTML可視化編輯器 | 4.1.10 | //kindeditor.net |
| My97 DatePicker | 時間選擇器 | 4.8 Beta4 | //www.my97.net/ |
後端技術
| 技術 | 名稱 | 版本 | 官網 |
|---|---|---|---|
| SpringBoot | SpringBoot框架 | 1.5.6.RELEASE | //spring.io/projects/spring-boot |
| JPA | spring-data-jpa | 1.5.6.RELEASE | //projects.spring.io/spring-data-jpa |
| Mybatis | Mybatis框架 | 1.3.0 | //www.mybatis.org/mybatis-3 |
| fastjson | json解析包 | 1.2.36 | //github.com/alibaba/fastjson |
| pagehelper | Mybatis分頁插件 | 1.0.0 | //pagehelper.github.io |
部署注意事項
- 下載項目、把oasys.sql導入本地資料庫
- 修改application.properties
- 修改數據源,oasys——>自己本地的庫名,用戶名和密碼修改成自己的
- 修改相關路徑,配置圖片路徑、文件路徑、附件路徑。(static/image/oasys.jpg 拷貝到配置的圖片路徑下,不然會報 FileNotFoundException )
- OasysApplication.java中的main方法運行,控制台沒有報錯資訊,數據啟動時間多久即運行成功
- 在瀏覽器中輸入localhost:8088/login
3.2.3.安裝環境導入項目
通過第一輪觀察可以發現和找到相關的項目跑起來所需要的文件,那麼接下去的第二步就是將這個項目導入到我們的IDE編譯工具中去,並且嘗試性的將這個項目運行起來,進行查看。
1.導入相關的sql文件
通常開源項目的作者會將項目的sql文件一起打包放入到開源項目中,在首頁目錄下一般都能看到相關的xxx.sql的文件,如果沒有可以查看一下有沒有相關叫sql的文件夾。

找到相關資料庫文件後,新建相關資料庫,並且將SQL文件進行運行。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DDcBrVgg-1627583726705)(img/10.png)]](http://img-blog.csdnimg.cn/7f3e4c88908f45d292a2ea23d64a2dc2.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDQ4NTY3,size_16,color_FFFFFF,t_70)
2.將項目用IDE工具打開
準備好相關的IDE工具,通常放在程式碼託管平台上面的項目是不會根據指定的編譯器的,而是保留了Maven的核心文件即可。
通常則將IDE編譯工具打開然後將對應路徑上的項目進行導入即可

3.分析目錄結構
在項目成功導入後可以對項目的目錄結構進行一下簡單的查看,看自己是否能夠看懂其大概的布局再開始下一步深入的項目分析

從上圖中是可以看到,就算是開源項目的目錄結構也是按照平時學習過程中的標準來的,也是按層級,按功能,按資源來劃分的
3.2.4.關於package-info.java
在查看開源項目的過程中可以看到很多包底下有package-info.java這個類,package-info.java是一個Java文件,可以放到任意Java源碼包執行。不過裡面的內容有特定的要求,其主要目的是為了提供包級別相關的操作,比如包級別的註解、注釋及公共變數。
1.提供包級別的註解
在對應的源碼包提供包級別的註解,簡單案例如下:
// 創建包註解
@Target(ElementType.PACKAGE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestPkg {
}
//在package-info.java中添加註解
@TestPkg
package com.exercise.data_collection_error_info_transformation.component;
// 可以查看相關註解
public class Client {
public static void main(String[] args) throws ClassNotFoundException {
// 查看包註解
String pkgName = "com.exercise.data_collection_error_info_transformation.component";
Package pkg = Package.getPackage(pkgName);
Annotation[] annotations = pkg.getAnnotations();
for(Annotation an:annotations){
if(an instanceof TestPkg){
System.out.println("Hi,I'm the TestPkg");
}
}
// 查看包下面對應的類的註解
Class test = Class.forName("com.exercise.data_collection_error_info_transformation.component.Test");
Annotation[] annotations2 = test.getAnnotations();
for(Annotation an:annotations2){
if(an instanceof TestPkg){
System.out.println("Hi,I'm the Class TestPkg");
}
}
}
}
/**
得到最終結果如下:
Hi,I'm the TestPkg
*/
如果一整個包都是過時的話,可以直接在package-info.java下面,添加註解@Deprecated,表示該源碼包已過時
2.提供包級別的變數
如果想在包裡面使用對應的變數,而不想讓其他包使用,就可以將變數放到package-info.java下面,實現分包自用的理念。
/**
在package-info.java類中添加如下內容
* 包類
*/
class PACKAGE_CLASS{
public void test(){
}
}
/**
* 包常量
*/
class PACKAGE_CONST{
public static final String TEST_01="TEST";
}
// 在同級別包中進行任意調用不會報錯
public class Client {
public static void main(String[] args) throws ClassNotFoundException {
System.out.println(PACKAGE_CONST.TEST_01);
}
}
3.方便JavaDoc文檔輸出
使用JavaDoc的時候,通過在package-info.java添加註釋,生成JavaDoc實現對應包的注釋說明。
3.3.Debug對項目進行分析
我們可以通過對程式項目進行斷點調試,來對項目的源碼功能進行分析。比如可以在最常見的登陸部分進行debug測試。

根據斷點一步一步的去感受作者在寫這些程式碼的每一步用意,看開源的意義就在於此,思考、借鑒非常的重要!
總結
所以個人總結下來有基礎的情況下一開始看開源項目的流程並不是很複雜,歸納如下:
- 了解什麼是開源
- 學會去找一個適合自己想看技術架構的開源項目
- 觀察開源項目(就是看readme.md文檔)以及下載開源項目
- 將下載下來的開源項目的目錄結構先進行分析,並且用IDE工具打開此開源項目
- 將開源項目運行起來
- 通過打斷點(Debug)運行項目的方式來思考作者的思路如果覺得好就可以成為自己的借鑒程式碼


