Git 是一個免費的、開源的分散式版本控制系統,可以快速高效地處理從小型到大型的各種 專案。
Git 易於學習,佔地面積小,效能極快。 它具有廉價的本地庫,方便的暫存區域和多個工作 流分支等特性。其效能優於 Subversion、CVS、Perforce 和 ClearCase 等版本控制工具。
版本控制是一種記錄檔案內容變化,以便將來查閱特定版本修訂情況的系統。 版本控制其實最重要的是可以記錄檔案修改歷史記錄,從而讓使用者能夠檢視歷史版本, 方便版本切換。
個人開發過渡到團隊共同作業
程式碼託管中心是基於網路伺服器的遠端程式碼倉庫,一般我們簡單稱為遠端庫。
到此,安裝完成,滑鼠右鍵出現選單,開啟bash終端,輸入git --version,出現版本資訊就說明安裝成功。
命令名稱 | 作用 |
---|---|
git config --global user.name 使用者名稱 | 設定使用者名稱 |
git config --global user.email 郵箱 | 設定使用者簽名 |
git init | 初始化本地庫 |
git status | 檢視本地庫狀態 |
git add 檔名 | 新增到暫存區 |
git commit -m "紀錄檔資訊" 檔名 | 提交到本地庫 |
get reflog | 檢視歷史記錄 |
git reset --head 版本號 | 版本穿梭 |
說明: 簽名的作用是區分不同操作者身份。使用者的簽名資訊在每一個版本的提交資訊中能夠看 到,
以此確認本次提交是誰做的。Git 首次安裝必須設定一下使用者簽名,否則無法提交程式碼。
※注意:這裡設定使用者簽名和將來登入 GitHub(或其他程式碼託管中心)的賬號沒有任 何關係。
在專案中開啟git終端,輸入命令
首次檢視沒有任何檔案
建立一個檔案,新增點內容試試
檢測到未追蹤的檔案,也就是這個檔案還在工作區
顏色變成綠色,該檔案已經被新增到暫存區
git rm --cached 檔名 可以將檔案移除暫存區,取消追蹤該檔案
git commit -m "紀錄檔資訊" 檔名
提交之後,檢視本地庫狀態,提示沒有檔案需要提交
將檔案修改之後,再次檢視本地庫狀態
提示檔案被修改過,並且變成了紅色
再次新增到暫存區
語法:
可以看到當前只有一個版本,再次提交,產生一個新的版本
再次檢視,出現了一個新的版本
基本語法:git reset --hard 版本號
先檢視一下現在本地庫的檔案
現在回退到第一次提交的版本
再次檢視檔案
已經回退到第一次提交的版本
git版本切換,其實操作的就是head指標
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,則預設會從暫存區檢出該檔案,如果暫存區為空,則該檔案會回滾到最近一次的提交狀態。
例如:
當暫存區為空,如果我們想要放棄對某一個檔案的修改,可以用這個命令進行復原:
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(第一次提交)-->修改內容-->
在版本控制過程中,同時推進多個任務,為每個任務,我們就可以建立每個任務的單獨 分支。
使用分支意味著程式設計師可以把自己的工作從開發主線上分離開來,開發自己分支的時 候,不會影響主線分支的執行。
對於初學者而言,分支可以簡單理解為副本,一個分支就是 一個單獨的副本。(分支底層其實也是指標的參照)
同時並行推進多個功能開發,提高開發效率。 各個分支在開發過程中,如果某一個分支開發失敗,不會對其他分支有任何影響。失敗 的分支刪除重新開始即可。
命令名稱 | 作用 |
---|---|
git branch 分支名 | 建立分支 |
git branch -v | 檢視分支 |
git checkout 分支名 | 切換分支 |
git merge 分支名 | 把指定的分支合併到當前分支上 |
此時已經有兩個分支(新建分分支是當前分支的副本)
在當前分支做修改,也就是master分支
再次提交到本地庫
git checkout -b 分支名
可以建立並切換分支
再次檢視檔案
可見,當前檔案沒有被修改
修改當前分支
切換回master分支,準備合併
建立一個新的分支並修改檔案內容,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分支修改檔案
合併分支
沒有出現衝突,程式碼直接合並
遠端倉庫國內可以使用gitee,存取速度更快,使用方法和github一樣,這裡只介紹github
註冊賬號,建立一個倉庫
建立完成之後
上面的地址就是倉庫地址
命令名稱 | 作用 |
---|---|
git remote | 檢視所有遠端倉庫 |
git remote -v | 檢視所有遠端倉庫詳細資訊 |
git remote add 別名 遠端地址 | 新增遠端倉庫並起別名 |
git push 遠端倉庫(可以別名) 分支 | 推播本地分支上的內容到遠端庫 |
git clone 遠端地址 | 將遠端倉庫的內容克隆到本地 |
git pull 遠端倉庫 遠端分支名 | 將當前遠端倉庫對於分支最新內容拉下來與當前本地分支直接合並 |
git remote rm 遠端倉庫 | 遠端倉庫 |
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
git pull 遠端倉庫 分支
拉取遠端分支到本地當前分支,並且自動合併
克隆遠端倉庫不需要登陸,公開倉庫讀許可權對所有人公開
克隆也不需要初始化倉庫,直接git clone 遠端倉庫地址
完成了克隆
合作者模式:
團隊內共同作業先要邀請開發人員,不然是無法push的,提示
remote: Permission to Z-HaiHua/GitTest.git denied to FH0524.
倉庫的所有者把邀請合作者一起開發這個專案(git提交程式碼會用這個賬號進行許可權驗證,具體提交的人還是看git設定裡面的郵箱),需要加入專案的人需要同意
成為合作者之後,才能通過這個登陸github的賬戶提交程式碼到倉庫
關於合作模式
git有兩種合作模式:
如果希望專案既有collaborator同時又可以限制他們的讀寫權利,尤其是限制其「寫」的權利,可利用organization來為team成員賦予不同等級的權力。
另外,合作者在主頁看不到自己合作的倉庫,需要到setting下的repository部分才能看到自己合作的專案
參加共同作業的人fork專案到自己的庫當中,然後自己庫中也會有一個和原倉庫一模一樣的倉庫,進行修改之後,通過pull request 向原專案傳送拉取請求
fork之後會出現
修改程式碼提交之後,點選 pull request,傳送拉取請求
選擇好合並的分支
再次點選pull request,開啟剛才的pull request
倉庫會收到pull request
開啟之後
點選合併之後,可以看到倉庫中程式碼已經改變
使用命令:
ssh-keygen -t rsa -C "#」
t是加密方式
c是備註訊息,便於自己記住此金鑰是幹嘛的,可以隨便填寫
之後三次回車,什麼都不輸入即可(第一次輸入檔案儲存位置,預設在C槽使用者目錄下.ssh資料夾,第二次輸入密碼,第三次確認密碼)
第一次使用SSH連線會提示
Are you sure you want to continue connecting (yes/no)? yes
輸入yes即可,以後這臺電腦連線github就不需要賬號密碼了
在專案開發中 ,我們肯定不希望整個專案的所有檔案都被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
在idea中使用git進行版本控制
點選版本控制設定
將檔案或者資料夾新增進忽略名單
忽略的檔案
新增暫存區和提交都是滑鼠右鍵--->Git--->.......
切換版本
在idea中開啟log視窗,可以檢視所有提交記錄,右鍵選擇checkout或者reset
新建分支:右鍵-->Git-->branch-->New Branch
切換分支:右鍵-->Git-->branch-->選擇要切換的分支-->點選-->checkout
刪除分支:當前分支不能刪除,需要切換到其他分支才可以刪除當前分支,右鍵-->Git-->branch-->選擇要刪除的分支-->點選-->delete
合併分支
合併衝突
使用令牌登陸,首先建立令牌
令牌建立之後要立馬複製下來,不然之後看不到了
然後到IDEA中新增賬號
之後把令牌填上去就可以登陸了,登陸之後
IDEA自帶的github外掛可以在idea中遠端建立github倉庫以及分享專案
在idea中建立倉庫必須要用賬號密碼登陸,其他操作可以用SSH免密登陸
新增一個SSH連線的git倉庫就好
push和pull,都是右鍵-->Git-->push/pull
克隆專案
輸入連結即可克隆專案
在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檔案
舊版下載
解壓即安裝完成
各目錄結構說明:
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槽,這裡改一下路徑
關於倉庫,我們前面講到了有三種:本地倉庫,私服,中央倉庫,其中私服和中央倉庫都屬於遠端倉庫
中央倉庫:maven團隊自身維護的倉庫,屬於開源的
私服:各公司/部門等小範圍記憶體儲資源的倉庫,私服也可以從中央倉庫獲取資源
本地倉庫:開發者自己電腦上儲存資源的倉庫,也可從遠端倉庫獲取資源
私服的作用:
(1)儲存具有版權的資源,包含購買或自主研發的jar
(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>
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>
Maven專案可以通過宣告式匯入所需要的資源,需要什麼,寫幾行程式碼,Maven就會自動把資源下載並新增到資源庫中
<!--專案依賴-->
<dependencies>
<!--具體依賴的jar包組態檔-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
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>
建立一個最簡單的Maven專案
這就是一個最簡單的Maven專案
建立完成記得看一眼是不是用的自己的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標籤的取值有四種:
這四種取值與範圍的對應情況如下:
Maven對專案構建的生命週期劃分為3套
clear:清理工作
default:核心工作,例如編譯、測試、打包、部署等
site:產生報告、釋出站點等
clean:清理工作
pre-clean:執行一些在clean之前的工作
clean:移除上一次構建產生的所有檔案
post-clean:執行一些在clean之後立刻完成的工作
default:核心工作,例如編譯,測試,打包,部署等
對於default生命週期,每個事件在執行之前都會將之前的所有事件依次執行一遍
site:產生報告,釋出站點等
pre-site:執行一些在生成站點檔案之前的工作
site:生成專案的站點檔案
post-site:執行一些在生成站點檔案之後完成的工作,為部署做準備
site-deploy:將生成的站點檔案部署到特定的伺服器上
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工程,處理多模組工程比較方便
使用:建立一個空模組,打包型別為pom,此模組不需要src
<packaging>pom</packaging>
定義當前模組構建時關聯的其他模組名稱
<modules>
<module>ssm-controller</module>
<module>ssm-service</module>
<module>ssm-dao</module>
<module>ssm-pojo</module>
</modules>
參與集合的模組構建順序與模組間的依賴有關,與設定無關
作用:通過繼承,可以實現在子工程中沿用父工程中的設定
使用:在子工程中宣告父工程座標與對應路徑
注意,繼承和聚合一樣,父工程中也只有一個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元素
繼承與聚合
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屬性分為
具體不在這裡贅述
工程版本
工程版本號約定
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>
<!--多環境設定-->
<!--建立多環境-->
<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>
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>
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