【maven】maven簡介
1、maven常用命令
* mvn compile 編譯原始碼
* mvn test-compile 編譯測試程式碼
* mvn test 執行測試
* mvn package 打包,根據pom.xml打成war或jar
如果pom.xml中設定 war,則此命令相當於mvn war:war
如果pom.xml中設定 jar,則此命令相當於mvn jar:jar
* mvn -Dtest package 打包但不測試。完整命令為:mvn -D maven.test.skip=true package
* mvn install 在本地Repository中安裝jar
* mvn clean 清除產生的專案
* mvn eclipse:eclipse 生成eclipse專案
* mvn idea:idea 生成idea專案
* mvn eclipse:clean 清除eclipse的一些系統設定
* mvn dependency:sources 下載原始碼
包衝突:
dependency:tree
dependency:tree -Dverbose
Dincludes=org.springframework:spring-tx
過濾串使用groupId:artifactId:version的方式進行過濾,可以不寫全啦,如:
mvn dependency:tree -Dverbose -Dincludes=asm:asm
在命令列輸入java -verbose:class XXX (XXX為程式名)你會在控制檯看到載入的類的情況。
當虛擬機器報告類找不到或類衝突時可用此引數來診斷來檢視虛擬機器從裝入類的情況。
2、maven生命週期
Maven有三套相互獨立的生命週期,請注意這裡說的是“三套”,而且“相互獨立”,初學者容易將Maven的生命週期看成一個整體,其實不然。這三套生命週期分別是:
* Clean Lifecycle 在進行真正的構建之前進行一些清理工作。
* Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等。
* Site Lifecycle 生成專案報告,站點,釋出站點。
Site生命週期的各個階段:
* pre-site 執行一些需要在生成站點文件之前完成的工作
* site 生成專案的站點文件
* post-site 執行一些需要在生成站點文件之後完成的工作,並且為部署做準備
* site-deploy 將生成的站點文件部署到特定的伺服器上
來看一下Maven的最重要的Default生命週期,絕大部分工作都發生在這個生命週期中,這裡,我只解釋一些比較重要和常用的階段:
* validate
* generate-sources
* process-sources
* generate-resources
* process-resources 複製並處理資原始檔,至目標目錄,準備打包。
* compile 編譯專案的原始碼。
* process-classes
* generate-test-sources
* process-test-sources
* generate-test-resources
* process-test-resources 複製並處理資原始檔,至目標測試目錄。
* test-compile 編譯測試原始碼。
* process-test-classes
* test 使用合適的單元測試框架執行測試。這些測試程式碼不會被打包或部署。
* prepare-package
* package 接受編譯好的程式碼,打包成可釋出的格式,如 JAR 。
* pre-integration-test
* integration-test
* post-integration-test
* verify
* install 將包安裝至本地倉庫,以讓其它專案依賴。
* deploy 將最終的包複製到遠端的倉庫,以讓其它開發人員與專案共享。
3、scope依賴範圍
compile (編譯範圍)
compile是預設的範圍;如果沒有提供一個範圍,那該依賴的範圍就是編譯範圍。編譯範圍依賴在所有的classpath 中可用,同時它們也會被打包。
provided (已提供範圍)
provided 依賴只有在當JDK 或者一個容器已提供該依賴之後才使用。例如, 如果你開發了一個web 應用,你可能在編譯 classpath 中需要可用的Servlet API 來編譯一個servlet,但是你不會想要在打包好的WAR 中包含這個Servlet API;這個Servlet API JAR 由你的應用伺服器或者servlet 容器提供。已提供範圍的依賴在編譯classpath (不是執行時)可用。它們不是傳遞性的,也不會被打包。
runtime (執行時範圍)
runtime 依賴在執行和測試系統的時候需要,但在編譯的時候不需要。比如,你可能在編譯的時候只需要JDBC API JAR,而只有在執行的時候才需要JDBC驅動實現。
test (測試範圍)
test範圍依賴 在一般的編譯和執行時都不需要,它們只有在測試編譯和測試執行階段可用。
system (系統範圍)
system範圍依賴與provided 類似,但是你必須顯式的提供一個對於本地系統中JAR 檔案的路徑。這麼做是為了允許基於本地物件編譯,而這些物件是系統類庫的一部分。這樣的構件應該是一直可用的,Maven 也不會在倉庫中去尋找它。如果你將一個依賴範圍設定成系統範圍,你必須同時提供一個 systemPath 元素。注意該範圍是不推薦使用的(你應該一直儘量去從公共或定製的 Maven 倉庫中引用依賴)。
import (Maven 2.0.9 之後新增)
它只使用在中,表示從其它的pom中匯入dependency的配置
4、依賴衝突
a.短路優先
A->B->C->X(jar)
A->D->X(jar)
b.先宣告先優先
如果路徑相同,誰先宣告,先解析誰