Git和Maven的學習筆記

2023-01-02 18:00:31

Git

1、Git簡介

Git 是一個免費的、開源的分散式版本控制系統,可以快速高效地處理從小型到大型的各種 專案。
Git 易於學習,佔地面積小,效能極快。 它具有廉價的本地庫,方便的暫存區域和多個工作 流分支等特性。其效能優於 Subversion、CVS、Perforce 和 ClearCase 等版本控制工具。

1.1、何為版本控制

版本控制是一種記錄檔案內容變化,以便將來查閱特定版本修訂情況的系統。 版本控制其實最重要的是可以記錄檔案修改歷史記錄,從而讓使用者能夠檢視歷史版本, 方便版本切換。

1.2、為什麼需要版本控制

個人開發過渡到團隊共同作業

1.3、版本控制工具

  • 集中式版本控制工具
    • CVS、SVN(Subversion)、VSS…… 集中化的版本控制系統諸如 CVS、SVN 等,都有一個單一的集中管理的伺服器,儲存 所有檔案的修訂版本,而協同工作的人們都通過使用者端連到這臺伺服器,取出最新的檔案或 者提交更新。多年以來,這已成為版本控制系統的標準做法。 這種做法帶來了許多好處,每個人都可以在一定程度上看到專案中的其他人正在做些什 麼。而管理員也可以輕鬆掌控每個開發者的許可權,並且管理一個集中化的版本控制系統,要 遠比在各個使用者端上維護本地資料庫來得輕鬆容易。 事分兩面,有好有壞。這麼做顯而易見的缺點是中央伺服器的單點故障。如果伺服器宕 機一小時,那麼在這一小時內,誰都無法提交更新,也就無法協同工作。
  • 分散式版本控制工具
    • Git、Mercurial、Bazaar、Darcs…… 像 Git 這種分散式版本控制工具,使用者端提取的不是最新版本的檔案快照,而是把程式碼 倉庫完整地映象下來(本地庫)。這樣任何一處協同工作用的檔案發生故障,事後都可以用 其他使用者端的本地倉庫進行恢復。因為每個使用者端的每一次檔案提取操作,實際上都是一次 對整個檔案倉庫的完整備份。 分散式的版本控制系統出現之後,解決了集中式版本控制系統的缺陷: 1. 伺服器斷網的情況下也可以進行開發(因為版本控制是在本地進行的) 2. 每個使用者端儲存的也都是整個完整的專案(包含歷史記錄,更加安全)

1.5、Git 工作機制

1.6、Git 和程式碼託管中心

程式碼託管中心是基於網路伺服器的遠端程式碼倉庫,一般我們簡單稱為遠端庫。

  • 區域網
    • GitLab
  • 網際網路
    • GitHub(外網)
    • Gitee 碼雲(國內網站)

2、安裝Git

  • 官網下載安裝包,點選開啟

到此,安裝完成,滑鼠右鍵出現選單,開啟bash終端,輸入git --version,出現版本資訊就說明安裝成功。

3、Git常用命令

命令名稱 作用
git config --global user.name 使用者名稱 設定使用者名稱
git config --global user.email 郵箱 設定使用者簽名
git init 初始化本地庫
git status 檢視本地庫狀態
git add 檔名 新增到暫存區
git commit -m "紀錄檔資訊" 檔名 提交到本地庫
get reflog 檢視歷史記錄
git reset --head 版本號 版本穿梭

3.1、設定使用者簽名

說明: 簽名的作用是區分不同操作者身份。使用者的簽名資訊在每一個版本的提交資訊中能夠看 到,
以此確認本次提交是誰做的。Git 首次安裝必須設定一下使用者簽名,否則無法提交程式碼。

※注意:這裡設定使用者簽名和將來登入 GitHub(或其他程式碼託管中心)的賬號沒有任 何關係。

3.2、初始化本地庫

在專案中開啟git終端,輸入命令

3.3、檢視本地庫狀態

首次檢視沒有任何檔案

建立一個檔案,新增點內容試試

檢測到未追蹤的檔案,也就是這個檔案還在工作區

3.4、新增到暫存區

顏色變成綠色,該檔案已經被新增到暫存區

3.5、從暫存區中移除

git rm --cached 檔名 可以將檔案移除暫存區,取消追蹤該檔案

3.6、提交本地庫

git commit -m "紀錄檔資訊" 檔名

提交之後,檢視本地庫狀態,提示沒有檔案需要提交

將檔案修改之後,再次檢視本地庫狀態

提示檔案被修改過,並且變成了紅色

再次新增到暫存區

3.7、歷史版本

語法:

  • git reflog 可以檢視所有分支的所有操作記錄(包括已經被刪除的 commit 記錄和 reset 的操作),
  • git log 則不能察看已經刪除了的commit記錄

可以看到當前只有一個版本,再次提交,產生一個新的版本

再次檢視,出現了一個新的版本

3.8、版本穿梭

基本語法:git reset --hard 版本號

先檢視一下現在本地庫的檔案

現在回退到第一次提交的版本

再次檢視檔案

已經回退到第一次提交的版本

git版本切換,其實操作的就是head指標

head指向分支,分支指標指向版本

3.9、關於版本切換和head指標

git中的head指標用於記錄當前工作的位置,可以指向commit版本,也可以指向分支

通常,我們工作在某一個分支上,比如 master 分支。當指向branch時commit提交後,master 指標和 HEAD 指標一起前進的,每做一次提交,這兩個指標就會一起向前挪一步。

但是在某種情況下(例如 checkout 了某個commit),master 指標 和 HEAD 指標這種「繫結」的狀態就被打破了,變成了分離頭指標狀態。下圖就是處於分離頭指標狀態的情況:

HEAD 遊離狀態的利弊

好處:HEAD 處於遊離狀態時,開發者可以很方便地在歷史版本之間互相切換,比如要回到某次提交,只需要 對應的 或者 名即可。

弊端:若在該基礎上進行了提交,則會新開一個「匿名分支」;也就是說我們的提交是無法可見儲存的,一旦切換到別的分支,原遊離狀態以後的提交就不可追溯了。

可以看到之後head指標指向了這個版本,而且有一個匿名分支

提交資訊和當前檔案也已經回到了這個版本的狀態

切換回其他分支,此匿名分支就不見了

在head指標處於遊離狀態時,我們所做的add和commit都是沒有意義的,切換到其他分支之後,head遊離狀態會消失,該分支也會消失

解決方法:在git checkout到提交的版本之後,建立一個新分支,然後我們所有操作都會儲存到這個分支,之後在合併就好

另外,checkout還可以用於復原檔案修改,git checkout 檔名

該命令主要用於檢出某一個指定檔案。
如果不填寫commit id,則預設會從暫存區檢出該檔案,如果暫存區為空,則該檔案會回滾到最近一次的提交狀態。
例如:
當暫存區為空,如果我們想要放棄對某一個檔案的修改,可以用這個命令進行復原:

3.10、關於git reset

reset有三種模式

  • --hard:重置位置的同時,直接將 working Tree工作目錄index 暫存區repository 都重置成目標Reset節點的內容,所以效果看起來等同於清空暫存區和工作區。

  • --soft:重置位置的同時,保留working Tree工作目錄index暫存區的內容,只讓repository中的內容和 reset 目標節點保持一致,因此原節點和reset節點之間的【差異變更集】會放入index暫存區中(Staged files)。所以效果看起來就是工作目錄的內容不變,暫存區原有的內容也不變,只是原節點和Reset節點之間的所有差異都會放到暫存區中。

  • --mixed(預設):重置位置的同時,只保留Working Tree工作目錄的內容,但會將 Index暫存區Repository 中的內容更改和reset目標節點一致,因此原節點和Reset節點之間的【差異變更集】會放入Working Tree工作目錄中。所以效果看起來就是原節點和Reset節點之間的所有差異都會放到工作目錄中。

假設現在有兩次提交,first commit和second commit,以下演示各自的區別

1、--hard,從second commit重置到first commit,second commit 提交記錄消失,工作區和暫存區都回到first commit提交時的狀態,也就是相當於first commit(第一次提交)-->直接復原所有修改

2、--soft,從second commit重置到first commit,second commit 提交記錄消失,工作區內容不變,將第二次修改的內容新增到暫存區,也就是相當於first commit(第一次提交)-->修改內容-->git add

3、--mixed(預設),從second commit重置到first commit,second commit 提交記錄消失,工作區內容不變,暫存區回到沒有將修改新增進暫存區的狀態,也就是相當於first commit(第一次提交)-->修改內容-->

4、Git分支操作

4.1、什麼是分支

在版本控制過程中,同時推進多個任務,為每個任務,我們就可以建立每個任務的單獨 分支。
使用分支意味著程式設計師可以把自己的工作從開發主線上分離開來,開發自己分支的時 候,不會影響主線分支的執行。
對於初學者而言,分支可以簡單理解為副本,一個分支就是 一個單獨的副本。(分支底層其實也是指標的參照)

4.2、分支的好處

同時並行推進多個功能開發,提高開發效率。 各個分支在開發過程中,如果某一個分支開發失敗,不會對其他分支有任何影響。失敗 的分支刪除重新開始即可。

4.3、分支的操作

命令名稱 作用
git branch 分支名 建立分支
git branch -v 檢視分支
git checkout 分支名 切換分支
git merge 分支名 把指定的分支合併到當前分支上

4.3.1、檢視分支

4.3.2、建立分支

此時已經有兩個分支(新建分分支是當前分支的副本)

在當前分支做修改,也就是master分支

再次提交到本地庫

4.3.3、切換分支

git checkout -b 分支名
可以建立並切換分支

再次檢視檔案

可見,當前檔案沒有被修改

修改當前分支

切換回master分支,準備合併

4.3.4、合併分支

  • 正常合併
    建立一個檔案,add和commit

建立一個新的分支並修改檔案內容,add和commit

切換回master分支,合併新分支

可以看到檔案直接修改了,並且提示資訊是Fast-forward

  • 合併衝突
    首先建立一個檔案

add和commit
建立並切換分支

在新分支裡做如下修改

add和commit,切換回master分支

修改檔案的同一行,add和commit

合併分支

提示合併行生衝突

檢視本地庫狀態

開啟修改的檔案

手動修改之後

再次add和commit,檢視本地庫狀態

合併之後提交必須全部一起提交,不然會報錯
fatal: cannot do a partial commit during a merge.(無法在合併期間部分提交)

關於兩個分支修改同一個檔案,合併時產生的情況

修改同一個檔案同一個區域會產生衝突
什麼是檔案的同一區域?

  • 檔案的同一行
  • 檔案的相鄰行

演示:

master分支

新建分支修改檔案

切換回master分支修改檔案

合併行生衝突

開啟檔案

同樣案例修改相隔一行:

分支修改檔案

切換回master分支修改檔案

合併分支

沒有出現衝突,程式碼直接合並

5、Git團隊共同作業機制

  • 1、團隊內共同作業

  • 2、跨團隊共同作業

6、GitHub操作

遠端倉庫國內可以使用gitee,存取速度更快,使用方法和github一樣,這裡只介紹github

註冊賬號,建立一個倉庫

建立完成之後

上面的地址就是倉庫地址

6.1、常用操作

命令名稱 作用
git remote 檢視所有遠端倉庫
git remote -v 檢視所有遠端倉庫詳細資訊
git remote add 別名 遠端地址 新增遠端倉庫並起別名
git push 遠端倉庫(可以別名) 分支 推播本地分支上的內容到遠端庫
git clone 遠端地址 將遠端倉庫的內容克隆到本地
git pull 遠端倉庫 遠端分支名 將當前遠端倉庫對於分支最新內容拉下來與當前本地分支直接合並
git remote rm 遠端倉庫 遠端倉庫

6.2、推播-git push

git push 遠端倉庫 本地分支名:遠端分支名

若當前分支和遠端分支名字相同,則可以省略
git push 遠端倉庫 分支名

注意:
第一次提交會要求選擇登陸方式,如果瀏覽器登陸過了直接用瀏覽器登陸就好
這裡登陸的賬戶和提交程式碼的賬戶沒有關係,登陸之後只是說明這臺電腦再次登陸github不需要使用者名稱密碼(以及驗證這個賬號對該倉庫的許可權), 具體提交程式碼的使用者是誰看git設定的郵箱

如果git-email和github-email不一致,則即使github-username和git-username使用者名稱相同,使用者在本地git和在github上操作也會被認為是不同的使用者在操作,意味著:github-email使用者建立了倉庫,git-email使用者從本地上傳的程式碼
如果git-email和github-email一致,則認為是同一使用者,意味著:使用者在本地git上操作再push到github上,和直接在github上操作沒有區別

總結:第一次上傳程式碼輸入使用者名稱密碼只是為了這臺電腦可以正常存取github

git的email和github的email相同,則github認為是本人操作
git的email和github的email不相同,也可以正常push,但是顯示的是另外一個人

另外,同一臺可以設定不同使用者名稱密碼
優先順序:local > global > system

6.3、拉取程式碼-git pull

git pull 遠端倉庫 分支

拉取遠端分支到本地當前分支,並且自動合併

6.4、克隆遠端倉庫-git clone

克隆遠端倉庫不需要登陸,公開倉庫讀許可權對所有人公開

克隆也不需要初始化倉庫,直接git clone 遠端倉庫地址

完成了克隆

6.5、團隊內共同作業

合作者模式:

團隊內共同作業先要邀請開發人員,不然是無法push的,提示

remote: Permission to Z-HaiHua/GitTest.git denied to FH0524.

倉庫的所有者把邀請合作者一起開發這個專案(git提交程式碼會用這個賬號進行許可權驗證,具體提交的人還是看git設定裡面的郵箱),需要加入專案的人需要同意

成為合作者之後,才能通過這個登陸github的賬戶提交程式碼到倉庫

關於合作模式

git有兩種合作模式:

  • 合作者模式(collaborator)
    需要倉庫主人將該使用者新增進合作者,邀請該使用者參與開發
    每個合作者新建自己部分的feature branch,在這個新分支上進行程式碼修改,提交合並

如果希望專案既有collaborator同時又可以限制他們的讀寫權利,尤其是限制其「寫」的權利,可利用organization來為team成員賦予不同等級的權力。

另外,合作者在主頁看不到自己合作的倉庫,需要到setting下的repository部分才能看到自己合作的專案

  • 貢獻者模式(contributor)--跨團隊共同作業
    每個貢獻者在他們fork的倉庫上進行程式碼修改、釋出自己負責的部分,再向主倉庫提起pull request

6.6、跨團隊共同作業

參加共同作業的人fork專案到自己的庫當中,然後自己庫中也會有一個和原倉庫一模一樣的倉庫,進行修改之後,通過pull request 向原專案傳送拉取請求

fork之後會出現

修改程式碼提交之後,點選 pull request,傳送拉取請求

選擇好合並的分支

再次點選pull request,開啟剛才的pull request

倉庫會收到pull request

開啟之後

點選合併之後,可以看到倉庫中程式碼已經改變

7、SSH免密登陸

使用命令:

ssh-keygen -t rsa -C "#」

t是加密方式
c是備註訊息,便於自己記住此金鑰是幹嘛的,可以隨便填寫

之後三次回車,什麼都不輸入即可(第一次輸入檔案儲存位置,預設在C槽使用者目錄下.ssh資料夾,第二次輸入密碼,第三次確認密碼)

第一次使用SSH連線會提示
Are you sure you want to continue connecting (yes/no)? yes
輸入yes即可,以後這臺電腦連線github就不需要賬號密碼了

8、IDEA整合Git

8.1、設定忽略檔案

在專案開發中 ,我們肯定不希望整個專案的所有檔案都被git追蹤,比如idea的組態檔,編譯之後的class檔案,這時候我們就需要設定忽略檔案

1、建立忽略規則組態檔xxx.ignore(字首隨便,檔案字尾必須是這個)該檔案放在哪裡都行

java專案中常用的ignore檔案

*.class

# Eclipse
.project
.classpath
.settings/

# Intellij
*.ipr
*.iml
*.iws
.idea/

# Maven
target/

# Gradle
build
.gradle

# Log file
*.log
log/

# out
**/out/

# Mac
.DS_Store

# others
*.jar
*.war
*.zip
*.tar
*.tar.gz
*.pid
*.orig
temp/

然後設定到git當中,可以設定到系統、使用者組、倉庫

[core]
	...
	excludesfile = D:/git/GitTest01/.git/.gitignore

8.2、idea中使用Git

8.2.1、設定Git

在idea中使用git進行版本控制

點選版本控制設定

8.2.2、設定Git忽略檔案

將檔案或者資料夾新增進忽略名單

忽略的檔案

8.2.3、基本使用

新增暫存區和提交都是滑鼠右鍵--->Git--->.......

切換版本

在idea中開啟log視窗,可以檢視所有提交記錄,右鍵選擇checkout或者reset

新建分支:右鍵-->Git-->branch-->New Branch

切換分支:右鍵-->Git-->branch-->選擇要切換的分支-->點選-->checkout

刪除分支:當前分支不能刪除,需要切換到其他分支才可以刪除當前分支,右鍵-->Git-->branch-->選擇要刪除的分支-->點選-->delete

合併分支

合併衝突

9、IDEA整合GitHub

使用令牌登陸,首先建立令牌

令牌建立之後要立馬複製下來,不然之後看不到了

然後到IDEA中新增賬號

之後把令牌填上去就可以登陸了,登陸之後

9.1、IDEA中建立github倉庫並分享專案

IDEA自帶的github外掛可以在idea中遠端建立github倉庫以及分享專案

9.2、IDEA中操作github

在idea中建立倉庫必須要用賬號密碼登陸,其他操作可以用SSH免密登陸

新增一個SSH連線的git倉庫就好

push和pull,都是右鍵-->Git-->push/pull

克隆專案

輸入連結即可克隆專案

Maven基礎

1、Maven是什麼

在Javaweb開發中,需要使用大量的jar包,我們手動去匯入;
如何能夠讓一個東西自動幫我匯入和設定這個jar包。由此,Maven誕生了!
Maven的本質是一個專案管理工具,將專案開發和管理過程抽象成一個專案物件模型(POM)

Maven是用Java語言編寫的。他管理的東西統統以物件導向的形式進行設計,最終它把一個專案看成一個物件,而這個物件叫做POM(project object model),即專案物件模型。

我們說一個專案就是一個物件,作為物件的行為、物件的屬性都有哪些呢?

Maven說我們需要編寫一個pom.xml檔案,Maven通過載入這個組態檔就可以知道我們專案的相關資訊了!到這裡我們知道了Maven離不開一個叫pom.xml的檔案。因為這個檔案代表就一個專案。
提個問題大家思考,如果我們做8個專案,對應的是1個檔案,還是8個檔案?肯定是8個!

那Maven是如何幫我們進行專案資源管理的呢?這就需要用到Maven中的第二個東西:依賴管理。這也是它的第二個核心!

所謂依賴管理就是maven對專案所有依賴資源的一種管理,它和專案之間是一種雙向關係,即當我們做專案的時候maven的依賴管理可以幫助你去管理你所需要的其他資源,當其他的專案需要依賴我們專案的時候,maven也會把我們的專案當作一種資源去進行管理,這就是一種雙向關係。

那maven的依賴管理它管理的這些資源存在哪兒呢?主要有三個位置:本地倉庫,私服,中央倉庫

本地倉庫顧名思義就是儲存在原生的一種資源倉庫,如果本地倉庫中沒有相關資源,可以去私服上獲取,私服也是一個資源倉庫,只不過不在本地,是一種遠端倉庫,如果私服上也沒有相關資源,可以去中央倉庫去獲取,中央倉庫也是一種遠端倉庫。

Maven除了幫我們管理專案資源之外還能幫助我們對專案進行構建,管理專案的整個生命週期,當然它的這些功能需要使用一些相關的外掛來完成,當然整個生命週期過程中外掛是需要配合使用的,單獨一個無法完成完整的生命週期。

1.2、Maven的作用
Maven的作用我們可以分成三類:

(1)專案構建:提供標準的,跨平臺的自動化構建專案的方式

(2)依賴管理:方便快捷的管理專案依賴的資源(jar包),避免資源間的版本衝突等問題

(3)統一開發結構:提供標準的,統一的專案開發結構,如下圖所示:

各目錄存放資源型別說明:

src/main/java:專案java原始碼

src/main/resources:專案的相關組態檔(比如mybatis設定,xml對映設定,自定義組態檔等)

src/main/webapp:web資源(比如html,css,js等)

src/test/java:測試程式碼

src/test/resources:測試相關組態檔

src/pom.xml:專案pom檔案

2、下載和安裝

舊版下載

解壓即安裝完成

各目錄結構說明:

bin:可執行程式目錄,

boot:maven自身的啟動載入器

conf:maven組態檔的存放目錄

lib:maven執行所需庫的存放目錄

設定環境變數

path環境變數中

輸入命令

即安裝成功

由於maven下載依賴預設從國外的中央倉庫下載,網速會很慢,所以要設定映象

開啟conf下的settings檔案

設定好映象

<mirror>
	  <id>aliyunmaven</id>
	  <mirrorOf>central</mirrorOf>
	  <name>阿里雲公共倉庫</name>
	  <url>https://maven.aliyun.com/repository/public</url>
</mirror>

由於maven預設把依賴下載到C槽,這裡改一下路徑

3、Maven基礎概念

3.1、倉庫

關於倉庫,我們前面講到了有三種:本地倉庫,私服,中央倉庫,其中私服和中央倉庫都屬於遠端倉庫

中央倉庫:maven團隊自身維護的倉庫,屬於開源的

私服:各公司/部門等小範圍記憶體儲資源的倉庫,私服也可以從中央倉庫獲取資源

本地倉庫:開發者自己電腦上儲存資源的倉庫,也可從遠端倉庫獲取資源

私服的作用:

(1)儲存具有版權的資源,包含購買或自主研發的jar

(2)一定範圍內共用資源,能做到僅對內不對外開放

3.2、座標

我們說maven的倉庫裡儲存了各種各樣的資源(jar包),那這些資源我們如何找到它們呢?我們需要知道它們具體的一個位置才能知道如何找到它們,這個就叫座標

座標:maven中的座標用於描述倉庫中資源的位置

maven座標的主要組成如下:

groupId:定義當前資源隸屬組織名稱(通常是域名反寫,如:org.mybatis;com.itheima)

artifactId:定義當前資源的名稱(通常是專案或模組名稱,如:crm,sms)

version:定義當前資源的版本號

packaging:定義資源的打包方式,取值一般有如下三種

  • jar:該資源打成jar包,預設是jar java工程打包為jar

  • war:該資源打成war包 web工程打包為war

  • pom:該資源是一個父資源(表明使用maven分模組管理),打包時只生成一個pom.xml不生成jar或其他包結構

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <!--指定pom的模型版本-->
    <modelVersion>4.0.0</modelVersion>
    <!--打包方式 web工程打包為war java工程打包為jar-->
    <packaging>war</packaging>
    
    <!--組織id-->
    <groupId>com.zh</groupId>
    <!--專案id-->
    <artifactId>web01</artifactId>
    <!--組織id  release代表完成版,SNAPSHOT代表開發版-->
    <version>1.0-SNAPSHOT</version>
    
    <!--設定當前工程的所有依賴-->
    <dependencies>
        <!--具體的依賴-->
        <dependency>
        </dependency>
    </dependencies>
</project>

3.3、外掛

Maven 實際上是一個依賴外掛執行的框架,它執行的每個任務實際上都由外掛完成的。Maven 的核心釋出包中並不包含任何 Maven 外掛,它們以獨立構件的形式存在, 只有在 Maven 需要使用某個外掛時,才會去倉庫中下載。

Maven 預設為一些核心的生命週期階段繫結了外掛目標,當用戶呼叫這些階段時,對應的外掛目標就會自動執行相應的任務。

執行web專案可以新增tomcat外掛

<build>  
    <plugins>        
	    <!--打war包外掛-->  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-war-plugin</artifactId>  
            <version>3.2.0</version>  
        </plugin>        
	    <!--Tomcat外掛 -->  
        <plugin>  
            <groupId>org.apache.tomcat.maven</groupId>  
            <artifactId>tomcat7-maven-plugin</artifactId>  
            <version>2.2</version>  
        </plugin>    
	</plugins>
</build>

3.4、依賴

Maven專案可以通過宣告式匯入所需要的資源,需要什麼,寫幾行程式碼,Maven就會自動把資源下載並新增到資源庫中

<!--專案依賴-->
  <dependencies>
    <!--具體依賴的jar包組態檔-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
    </dependency>
  </dependencies>

3.5、POM檔案

pom.xml 是Maven的核心組態檔

<?xml version="1.0" encoding="UTF-8"?>

<!--Maven版本和標頭檔案-->
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>


  <groupId>com.zh</groupId>
  <artifactId>javaweb-01-maven</artifactId>
  <version>1.0-SNAPSHOT</version>
  <!--Package:專案的打包方式
  jar:java應用
  war:JavaWeb應用
  -->
  <packaging>war</packaging>


  <!--設定-->
  <properties>
    <!--專案的預設構建編碼-->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!--編碼版本-->
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <!--專案依賴-->
  <dependencies>
    <!--具體依賴的jar包組態檔-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
    </dependency>
  </dependencies>

  <!--專案構建用的東西-->
    <build>  
        <plugins>            
        <!--打war包外掛-->  
            <plugin>  
                <groupId>org.apache.maven.plugins</groupId>  
                <artifactId>maven-war-plugin</artifactId>  
                <version>3.2.0</version>  
            </plugin>            
            <!--Tomcat外掛 -->  
            <plugin>  
                <groupId>org.apache.tomcat.maven</groupId>  
                <artifactId>tomcat7-maven-plugin</artifactId>  
                <version>2.2</version>  
            </plugin>        
		</plugins>    
	</build>
</project>

4、建立Maven專案

建立一個最簡單的Maven專案

這就是一個最簡單的Maven專案

建立完成記得看一眼是不是用的自己的Maven倉庫

5、Maven依賴管理

依賴傳遞:

依賴具有傳遞性,分兩種

(1)直接依賴:在當前專案中通過依賴設定建立的依賴關係

(2)間接依賴:被依賴的資源如果依賴其他資源,則表明當前專案間接依賴其他資源

依賴傳遞衝突

依賴傳遞的衝突問題:
在依賴傳遞過程中產生了衝突,我們有三種優先法則

(1)路徑優先:當依賴中出現相同資源時,層級越深,優先順序越低,反之則越高

(2)宣告優先:當資源在相同層級被依賴時,設定順序靠前的覆蓋靠後的

(3)特殊優先:當同級設定了相同資源的不同版本時,後設定的覆蓋先設定的

以一個專案為根,直接依賴稱為1度資源,直接依賴的直接依賴稱為2度資源,直接依賴的直接依賴的直接依賴稱為3度資源。

當然依賴衝突在這裡我們並不需要記,後面會有如何解決此問題的辦法。

可選依賴

可選依賴指的是對外隱藏當前所依賴的資源-->不透明

加一個optional屬性

<dependencies>
    <dependency>
        <groupId>Junit</groupId>
        <artifactId>Junit</artifactId>
        <version>4.12</version>
        <optional>true</optional>
    </dependency>
</dependencies>

排除依賴

排除依賴指主動斷開依賴的資源,被排除的資源無需指定版本

<dependencies>
    <dependency>
        <groupId>Junit</groupId>
        <artifactId>Junit</artifactId>
        <version>4.12</version>
        <exclusions>
            <exclusion>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
            </exclusion>
    </dependency>
</dependencies>

依賴範圍

依賴的jar預設情況可以在任何地方可用,可以通過scope標籤設定其作用範圍

這裡的範圍主要是指以下三種範圍

(1)主程式範圍有效(src/main目錄範圍內)

(2)測試程式範圍內有效(src/test目錄範圍內)

(3)是否參與打包(package指令範圍內)

此外:scope標籤的取值有四種:

  • compile
  • test
  • provided
  • runtime

這四種取值與範圍的對應情況如下:

6、Maven生命週期與外掛

Maven對專案構建的生命週期劃分為3套

clear:清理工作
default:核心工作,例如編譯、測試、打包、部署等
site:產生報告、釋出站點等

6.1、clear生命週期

clean:清理工作

pre-clean:執行一些在clean之前的工作

clean:移除上一次構建產生的所有檔案

post-clean:執行一些在clean之後立刻完成的工作

6.2、default生命週期

default:核心工作,例如編譯,測試,打包,部署等

對於default生命週期,每個事件在執行之前都會將之前的所有事件依次執行一遍

6.3、site生命週期

site:產生報告,釋出站點等

pre-site:執行一些在生成站點檔案之前的工作

site:生成專案的站點檔案

post-site:執行一些在生成站點檔案之後完成的工作,為部署做準備

site-deploy:將生成的站點檔案部署到特定的伺服器上

7、Maven資源匯出問題

pom檔案中加入如下設定

<!--在build中設定resources,來防止我們資源匯出失敗的問題-->
<!--resources下的properties、xml都可以匯出-->
<!--java下的properties、xml都可以匯出-->
<build>
    <resources>
        <resource>
        <directory>src/main/resources</directory>
        <includes>
            <include>**/*.properties</include>
            <include>**/*.xml</include>
        </includes>
        <filtering>true</filtering>
        </resource>
        <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.properties</include>
            <include>**/*.xml</include>
        </includes>
        <filtering>true</filtering>
        </resource>
    </resources>
</build>

Maven進階

1、分模組開發與設計

按模組劃分之後,將需要使用的模組使用引入資源的方式引入即可,注意,在引入之前,需要先將該模組安裝到本地庫中

2、聚合模組

作用:快速構建maven工程,處理多模組工程比較方便

使用:建立一個空模組,打包型別為pom,此模組不需要src

<packaging>pom</packaging>

定義當前模組構建時關聯的其他模組名稱

<modules> 
	<module>ssm-controller</module> 
	<module>ssm-service</module> 
	<module>ssm-dao</module> 
	<module>ssm-pojo</module>
</modules>

參與集合的模組構建順序與模組間的依賴有關,與設定無關

3、繼承

作用:通過繼承,可以實現在子工程中沿用父工程中的設定

使用:在子工程中宣告父工程座標與對應路徑

注意,繼承和聚合一樣,父工程中也只有一個pom檔案

<parent>
	<groupId>. . .</groupId>
	<artifactId>. . .</artifactId>
	<version>. . .</version>
	<relativePath>. . .</relativePath>
</parent>

在父工程中管理依賴

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${springframework.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${springframework.version}</version>
		</dependency>
	</dependencies>
</dependencyManagement>

外掛管理

<build>
	<pluginManagement>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.5</source>
					<target>1.5</target>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-resources-plugin</artifactId>
				<configuration>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
		</plugins>
	</pluginManagement>
</build>

這裡宣告只是為子工程設定版本,並不是實際的去參照依賴

子工程繼承之後,不在需要寫完整的GAV,讓父工程統一管理

<groupId>com.juvenxu.mvnbook.account</groupId> 
<artifactId>account-parent</artifactId> 
<version>1.0.0-SNAPSHOT</version>

只需要寫

<artifactId>account-parent</artifactId> 

同時,在依賴和外掛中也只需要寫

<dependency> 
	<groupId>org.springframework</groupId> 
	<artifactId>spring-core</artifactId> 
</dependency>

版本通過父工程繼承

可繼承的pom元素

  • groupId:專案組ID,專案座標的核心元素
  • version: 專案版本, 專案座標的核心元素
  • description: 專案的描述資訊
  • organization: 專案的組織資訊
  • inceptionYear: 專案的創始年份
  • url: 專案的URL地址
  • developers: 專案開發者資訊
  • contributors: 專案的貢獻者資訊
  • distributionManagement: 專案的部署設定
  • issueManagement: 專案的缺陷跟蹤系統資訊
  • ciManagement: 專案的持續整合系統資訊
  • scm: 專案的版本控制系統資訊
  • mailingLists: 專案的郵寄清單資訊
  • properties: 自定義的maven屬性
  • dependencies: 專案的依賴設定
  • dependencyManagement: 專案的依賴管理設定
  • repositories: 專案的倉庫設定
  • build: 包括專案的原始碼目錄設定、輸出目錄設定、外掛設定、外掛管理設定等
  • reporting: 包括專案的報告輸出目錄設定、報告外掛設定等

繼承與聚合

  • 作用
    • 聚合用於快速構建專案
    • 繼承用於快速設定
  • 相同點
    • 聚合與繼承的pom檔案打包方式都為pom,可以將兩種關係製作在同一個pom檔案中
    • 聚合與繼承屬於設計模式,並無實際的模組內容
  • 不同點
    • 聚合是在當前模組中設定關係,聚合可以感知到參與聚合的模組有哪些
    • 繼承是在子模組中設定關係,父模組無法感知哪些子模組繼承了自己

4、屬性

Maven中允許自定義屬性,相當於變數,在需要的地方參照

<properties>
    <spring.framework>4.0.4.RELEASE</spring.framework>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.framework}</version>
    </dependency>
</dependencies>

此外,maven屬性分為

  • 內部屬性
    • 內建屬性
    • 專案屬性
    • setting屬性
    • 自定義屬性
  • 外部屬性
    • java系統屬性
    • 環境變數屬性

具體不在這裡贅述

5、版本管理

工程版本

  • SNAPSHOT (快照版本)
    • 專案開發過程中,為方便團隊成員合作,解決模組間相互依賴和時時更新的問題,開發者對每個模組進行構建的時候,輸出的臨時性版本叫快照版本(測試階段版本)
    • 快照版本會隨著開發的進展不斷更新
  • RELEASE (釋出版本)
    • 專案開發到進入階段里程碑後,向團隊外部發布較為穩定的版本,這種版本所對應的構件檔案是穩定的,即便進行功能的後續開發,也不會改變當前釋出版本內容,這種版本稱為釋出版本

工程版本號約定

  • 約定規範:
    • <主版本>.<次版本>.<增量版本>.<里程碑版本>
    • 主版本:表示專案重大架構的變更,如: spring5相較 於spring4的迭代
    • 次版本:表示有較大的功能增加和變化,或者全面系統地修復漏洞
    • 增量版本:表示有重大漏洞的修復
    • 里程碑版本:表明- -個版本的里程碑(版本內部)。這樣的版本同下一-個正式版本相比,相對來說不是很穩定,有待更多的測試
  • 範例:
    5.1.9.RELEASE

6、資源設定

maven支援組態檔使用pom檔案裡面設定的屬性

使用:在pom檔案中定義屬性和屬性值,在組態檔中使用${屬性} 的方式參照

<properties>
    <jdbc.url>jdbc:mysql://localhost:3306/de01</jdbc.url>
</properties>
.....
設定資原始檔對應的資訊
<resources>
	<resource>
	<!-設定組態檔對應的位置目錄,支援使用屬性動態設定路徑-->
	<directory>${project.basedir}/src/main/resources</directory>
	<!--開啟對組態檔的資源載入過濾-->
	<filtering>true</ filtering>
	</resource>
</resources>

7、多環境開發設定

<!--多環境設定-->
<!--建立多環境-->
<profiles>
<!--定義具體的環境:生產環境-->
	<profile>
	<!--定義環境對應的唯一名稱-->
		<id>pro_ env</id>
		<!--定義環境中專用的屬性值-->
		<properties>
			<jdbc.ur1>jdbc:mysql://127.1.1.1:3306/ssmdb</jdbc.ur1>
		</ properties>
		<!--設定預設啟動-->
		<activation>
			<activeByDefault>true</ activeByDefault>
		</activation>
	</profi1e>
	<!--定義具體的環境:開發環境-->
	<profile>
	<id>dev_env</id>
	....
	</profi1e>
</profiles>

8、跳過測試

  • 使用命令跳過測試
mvn 指令 -D skipTests
  • 使用idea介面操作

  • 通過設定外掛

<plugin>
	<artifactId>maven- surefire -plugin</artifactid>
	<version>2.22. 1</version>
	<configuration>
		<skipTests>true</ skipTests><!--設定跳過測試-->
		<includes> <!-- 包含指定的測試用例-->
			<include>**/User*Test.java</include>
		</includes>
		<excludes><!--排除指定的測試用例-->
			<exclude>**/User*TestCase.java</exclude>
		</excludes>
	</configuration>
</p1ugin>

9、私服

Nexus倉庫型別

Nexus倉庫型別有三種:

1.hosted:宿主倉庫(伺服器本地倉庫):通常我們上傳自己的依賴到這一型別的倉庫,比如公司的第二方庫。

2.proxy:代理倉庫:它們被用來代理遠端的公共倉庫,如maven中央倉庫

3.group:倉庫組:倉庫的集合,把多個倉庫的依賴都整合到一個大的集合中來;用來合併多個hosted/proxy倉庫,當你的專案希望在多個repository使用資源時就不需要多次參照了,只需要參照一個group即可。

安裝好Nexus後,系統會預先自帶幾個倉庫:如圖:

下面說說,另外三種倉庫的作用:

1.Releases: 這裡存放我們自己專案中釋出的構建,通常是Release版本的,已經正式釋出的。

2.Snapshots:存放臨時的依賴,非最終版本、非穩定版本的依賴,比如你正在開發的starter,你的同事需要參照裡面的類,就可以釋出到這個型別的倉庫中。

3.3rd Party:存放第三方的依賴。

安裝nexus

下載之後直接解壓即可

啟動nexus

切換到安裝目錄下的bin目錄下的命令列

啟動:./nexus start

關閉:./nexus stop

埠修改:埠可以在組態檔中修改  xxx/nexus-3.28.1-01/etc/nexus-default.properties

瀏覽器存取 \http://localhost:8081即是nexus登陸頁面

登入

賬戶:admin

密碼:檢視 sonatype-work/nexus3/admin.password

基礎操作

./nexus status 檢視啟動狀態

./nexus stop 停止

./nexus restart重啟

設定私服的映象路徑

獲取資源的路徑,設定倉庫組,表示從倉庫組中獲取資源
在settings.xml 檔案的 mirrors 內新增以下映象地址

<mirror>
    <id>maven-public</id>
    <name>maven-public</name>
    <mirrorOf>*</mirrorOf>
    <url>http://localhost:8081/repository/maven-public/</url>
</mirror>

設定伺服器資訊

本地存取倉庫的許可權,用於上傳資源

<!-- 伺服器的賬戶密碼設定-->
<servers>
	<server>
	  <!-- id可以隨便取 但是在pom中參照的時候需要保持一致-->
	    <id>maven_release</id>
	    <username>admin</username>
	    <password>admin</password>
	</server>
	<server>
	    <id>maven_snapshots</id>
	    <username>admin</username>
	    <password>admin</password>
	</server>
 
	<server>
	  <id>maven-central</id>
	  <username>admin</username>
	  <password>admin</password>
	</server>
</servers>

設定當前專案存取私服上傳資源儲存位置(pom.xml)

<distributionManagement><!-- 遠端部署管理資訊 --> 
<!-- 專案部署到私服設定 id和上面server中設定的id一致-->  
        <repository><!--部署專案產生的構件到遠端倉庫需要的資訊 -->
            <id>maven_release</id>
            <name>maven-releases</name>
            <url>http://localhost:8081/repository/maven-releases/</url>
        </repository>
        <snapshotRepository><!-- 如果沒有設定該元素,預設部署到repository元素設定的倉庫 -->
            <id>maven_snapshots</id>
            <name>maven-snapshots</name>
            <url>http://localhost:8081/repository/maven-snapshots/</url>
        </snapshotRepository>
</distributionManagement>

發補資源到私命令

mvn deploy