原文地址:www.yuque.com/dobbykim/java-basic/...
一:Maven 簡介與簡單實用
Maven 是 Java 世界中最流行的專案構建工具之一。
說白了, Maven 的主要職責就是“包管理”。在沒有像 Maven 這樣的包管理工具之前,我們做一個 Java 專案,需要第三方依賴包要怎麼做呢?我們需要將別人打好的 Jar 包下載到本地,然後手動指定給專案。這種操作十分麻煩,比如版本控制,我們用的第三方包需要使用新版本怎麼辦呢?只能重新進行下載,重新指定。
而使用了 Maven 專案構建工具後,需要什麼第三方包,我們直接可以在 pom.xml 檔案中新增幾行 XML 程式碼,指定包名,版本等資訊就可以了。另外,Maven 還提供了很多外掛,比如常用的打包外掛,除錯外掛等等,方便我們專案的開發和部署。
Maven 的生命週期與外掛
1. 生命週期
Maven 擁有三套相互獨立的生命週期:
clean
default
site
clean 生命週期的目的是清理專案,default 生命週期的目的是構建專案,site 生命週期的目的是建立專案站點。
每個生命週期包含一些階段(phase),這些階段是有先後順序的,並且後面的階段依賴於前面的階段,使用者和 Maven 最直接的互動方式就是好呼叫這些生命週期的階段。
三套生命週期本身是相互獨立的,使用者可以僅呼叫 clean 生命週期的某個階段,或者僅僅呼叫 default 生命週期的某個階段的時候不會觸發其他生命週期的任何階段。
clean 生命週期
clean 生命週期的目的是清理專案,它包含三個階段:
pre-clean:執行一些清理前需要完成的工作
clean:清理上一次構建生成的檔案
post-clean:執行一些清理後需要完成的工作
default 生命週期
default 生命週期定義了真正構建專案時所需要執行的步驟,它是所有生命週期中最核心的部分,其包含的階段如下:
validate:驗證工程是否正確,所需的資訊是否完整
initialize:初始化構建平臺
generate-sources
process-sources
generate-resources:
process-resources:處理專案主資原始檔,一般來說,是針對 src/main/resources 目錄內容進行變數替換等工作後,複製到專案輸出的主 classpath 目錄中
compile:編譯專案的程式碼。一般來說,是編譯 src/main/java 目錄下的 java 檔案至專案輸出的主 classpath 目錄中
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources:處理專案測試資原始檔。一般來說,是對 src/test/resources 目錄的內容進行變數替換工作後,複製到專案輸出的測試 classpath 目錄中
test-compile:編譯專案的測試程式碼。一般來說,是編譯 src/test/java 目錄下的 java 檔案至專案輸出的測試 classpath 目錄中
process-test-classes
test:使用單元測試框架執行測試,測試程式碼不會被打包或者部署
prepare-package
package:接受編譯好的程式碼,將工程檔案打包為指定的格式,例如 Jar,War 等等
pre-integration-test
integration-test:整合測試
post-integration-test
verify:檢查 package 是否有效,符合標準
install:將包安裝至 Maven 本地倉庫,供本地其他的 Maven 專案使用
deploy:將最終的包複製到遠端倉庫,供其他開發人員和 Maven 專案使用
site 生命週期
site 生命週期的目的是建立和釋出專案站點, Maven 能夠基於 pom 檔案所包含的資訊,自動生成一個友好的站點,方便團隊交流和釋出專案。該生命週期包含階段如下:
pre-site:執行一些在生成專案站點之前需要完成的工作
site:生成專案站點文件
post-site:執行一些在生成專案站點之後需要完成的工作
site-deploy:將生成的專案站點發布到伺服器上
2. 外掛與目標
Maven 三套生命週期定義的各個階段我們已經大致介紹完畢了。
Maven 三套生命週期定義的各個階段實際上是不會做任何工作的,這些實際的工作是由外掛(plugin)來完成的,每個生命週期階段都是由外掛的目標(goal)來完成的。
Maven 的生命週期與外掛相互繫結,用以完成實際的構建任務。Maven 的核心僅僅是定義了抽象的生命週期,然而具體的任務還是要由外掛來完成,如果當前的生命週期階段沒有繫結任何外掛的任何目標,那麼這個階段就什麼都不會做。
例如專案編譯這一任務,它對應了 default 生命週期的 compile 這一階段,而 maven-compiler-plugin 這一外掛的 compile 目標能夠完成該任務。因此將它們互相繫結,就能夠實現專案編譯的目的。
為了讓使用者不用做任何配置就能構建 Maven 專案,Maven 為一些主要的生命週期階段繫結了很多外掛的目標,這些是內建繫結,當使用者通過命令列呼叫生命週期階段時,對應的外掛目標就會執行相應的任務,一些內建繫結關係如下:
clean 生命週期階段與外掛目標的內建繫結:
生命週期階段 | 外掛目標 | 執行任務 |
---|---|---|
pre-clean | ||
clean | maven-clean-plugin:clean | 清理上一次構建生成的檔案 |
post-clean |
default 生命週期階段與外掛目標的內建繫結:
生命週期階段 | 外掛目標 | 執行任務 |
---|---|---|
process-resources | maven-resources-plugin:resources | 複製主資原始檔至主輸出目錄 |
compille | maven-compiler-plugin:compile | 編譯主程式碼至主輸出目錄 |
process-test-resources | maven-resources-plugin:testResources | 複製測試資原始檔至測試輸出目錄 |
test-compile | maven-compiler-plugin:testCompile | 編譯測試程式碼至測試輸出目錄 |
test | maven-surefire-plugin:test | 執行測試用例 |
package | maven-jar-plugin:jar | 建立專案jar包 |
install | maven-install-plugin:install | 將專案輸出構件安裝到本地倉庫 |
deploy | maven-deploy-plugin:deploy | 將專案輸出構件部署到遠端倉庫 |
default 生命週期還有很多的階段,預設他們沒有繫結任何外掛,因此也沒有任何的實際行為。
site 生命週期階段與外掛目標的內建繫結:
生命週期階段 | 外掛目標 | 執行任務 |
---|---|---|
pre-site | ||
site | maven-site-plugin:site | 生成專案站點文件 |
post-site | ||
site-deploy | maven-site-plugin:deploy | 將生成的專案站點發布到伺服器上 |
除了內建繫結外,使用者還能夠自己選擇將某個外掛的目標繫結到生命週期的某個階段上。該部分內容,後面會介紹到。
3. 執行一個 Maven 命令,發生了什麼?
執行一個 Maven 的命令,例如 mvn test
這個命令,Maven 會將包含 test 這個階段之前所有的階段全部執行一遍!
如果該階段沒有繫結任何外掛目標,那就什麼也不執行。
拿一個經典面試題來舉例:
問:
我們經常使用 “mvn clean package” 命令進行專案打包,請問該命令執行了哪些動作?
在這個命令中,我們呼叫了 Maven 的 clean 生命週期的 clean 階段繫結的外掛目標,以及 default 生命週期的 package 階段以前所有階段繫結的外掛目標:
maven-clean-plugin:clean ->
maven-resources-plugin:resources ->
maven-compiler-plugin:compile ->
maven-resources-plugin:testResources ->
maven-compiler-plugin:testCompile ->
maven-surefire-plugin:test ->
maven-jar-plugin:jar
二:IDEA 生產力翻倍的快捷鍵
萬用鍵:強大的智慧提示(option + enter)
Search everywhere:雙擊 Shift
檢視定義:Declaration (command + B)
檢視檔案:Navigate-File
高階查詢:Find in Path (shift + command + F)
快速生成:Generate(control + enter)
格式化:Reformat Code(option + command + L)
優化匯入語句:Optimize imports(control + option + O)
導航:Navigate-Back/Forward
誰呼叫了這個方法:Call Hierarchy(shift + command + H)
所有的實現類:Implementation
檔案大綱:File Structure
下一處錯誤:Next Highlighted Error
高階重新命名:Rename,批量重新命名(shift + fn + F6)
偵錯程式快捷鍵:F5/F6/F7/F8
註釋多行程式碼:(command + /)
快速複製游標所在的那一行程式碼:(command + D)
快速刪除游標所在的那一行程式碼:(command + X)
三:在 IDEA 中使用Git工具查詢背鍋俠
查詢背鍋俠:Annotate/Blame
檢視當前檔案的歷史版本
高階篩選方式查詢 commit 記錄
顯示差異:show diff
Open in GitHub
四:其他 IDEA 的小功能
IDEA 中支援一些快捷生成程式碼的縮寫
psvm:快速生成 main 方法
sout :
System.out.println()
foreach :快捷生成
for(:){}
程式碼塊fori : 快捷生成
for(int i = 0; i < ; i++){}
程式碼塊等等… …
IDEA 也有非常方便的一些外掛:
在 Preferences -> Plugins 裡面,我們可以為自己的 IDEA 安裝自己需要的外掛
譬如:
Lombok
ASM Bytecode Viewer
Maven Helper
Mybatis Log Plugin
… …
五:偵錯程式入門與詳解
為什麼要使用偵錯程式(debugger)
理解程式執行的過程
理解 JVM 的內部構造
非常方便地檢查在任意時間點 JVM 的內部狀態
偵錯程式的使用:
step over:快捷鍵 F8,單步跳步,每次執行一行
step into:快捷鍵 F7,單步進入,比如當前行是一個方法,單步進入會進入到該方法中
Resume Program:全速執行到下一個斷點位置,在 IDEA Debugger 中,該符號為:
step out:快捷鍵 shift + F8,跳出,同 step into 相反,每點一次,就會跳出一個方法
Condition:條件斷點,在斷點中輸入條件,為正常的 Java 程式碼
Evaluate Expression:執行表示式
本作品採用《CC 協議》,轉載必須註明作者和本文連結