你們好,我是Java最全面試題庫
的提褲姐,今天這篇是Java工具系列的第二篇,主要總結了maven
相關的問題,在後續,會沿着第一篇開篇的知識線路一直總結下去,作到日更!若是我能作到百日百更,但願你也能夠跟着百日百刷,一百天養成一個好習慣。java
Maven是基於POM(工程對象模型),經過一小段描述來對項目的代碼、報告、文件進管理的工具。
Maven是一個跨平臺的項目管理工具
,它是使用java開發的,它要依賴於jdk1.6及以上
Maven主要有兩大功能:管理依賴
、項目構建
。(依賴指的是jar包)web
優勢:面試
缺點:spring
compile
:編譯依賴,默認的依賴方式,在編譯(編譯項目和編譯測試用例),運行測試用例,運行(項目實際運行)三個階段都有效,典型地有spring-core等jar。test
:測試依賴,只在編譯測試用例和運行測試用例有效,典型地有JUnit。provided
:對於編譯和測試有效,不會打包進發布包中,典型的例子爲servlet-api,通常的web工程運行時都使用容器的servlet-api。runtime
:只在運行測試用例和實際運行時有效,典型地是jdbc驅動jar包。system
:不從maven倉庫獲取該jar,而是經過systemPath指定該jar的路徑。import
:用於一個dependencyManagement對另外一個dependencyManagement的繼承。groupId
:定義當前 Maven 項目隸屬的實際項目。artifactId
:該元素定義當前實際項目中的一個 Maven 項目(模塊)。推薦的作法是使用實際項目名稱做爲 artifactId 的前綴。好比上例中的 junit ,junit 就是實際的項目名稱,方便並且直觀。在默認狀況下,Maven 生成的構件,會以 artifactId 做爲文件頭。例如 junit-3.8.1.jar ,使用實際項目名稱做爲前綴,就能方便的從本地倉庫找到某個項目的構件。version
:該元素定義了使用構件的版本。packaging
:定義 Maven 項目打包的方式,使用構件的什麼包。打包方式一般與所生成構件的文件擴展名對應。classifier
:該元素用來幫助定義構建輸出的一些附件。附屬構件與主構件對應。api
mvn archetype
:create :建立 Maven 項目。mvn compile
:編譯源代碼。mvn deploy
:發佈項目。mvn test-compile
:編譯測試源代碼。mvn test
:運行應用程序中的單元測試。mvn site
:生成項目相關信息的網站。mvn clean
:清除項目目錄中的生成結果。mvn package
:根據項目生成的 jar/war 等。mvn install
:在本地 Repository 中安裝 jar 。mvn clean package -Dmaven.test.skip=true
:清除之前的包後從新打包,跳過測試類。清理 ->編譯 ->測試 ->報告 ->打包 ->部署緩存
Maven有三套相互獨立的生命週期,分別是 Clean
、Default
和 Site
。每一個生命週期包含一些階段,階段是有順序的,後面的階段依賴於前面的階段。服務器
Clean 生命週期:
清理項目:pre-clean
:執行清理前須要完成的工做。clean
:清理上一次構建生成的文件。post-clean
:執行清理後須要完成的工做網絡
Default 生命週期:
構建項目:validate
:驗證工程是否正確,全部須要的資源是否可用。compile
:編譯項目的源代碼。test
:使用合適的單元測試框架來測試已編譯的源代碼。這些測試不須要已打包和佈署。package
:把已編譯的代碼打包成可發佈的格式,好比 jar、war 等。integration-test
:若有須要,將包處理和發佈到一個可以進行集成測試的環境。verify
:運行全部檢查,驗證包是否有效且達到質量標準。install
:把包安裝到maven本地倉庫,能夠被其餘工程做爲依賴來使用。deploy
:在集成或者發佈環境下執行,將最終版本的包拷貝到遠程的repository,使得其餘的開發者或者工程能夠共享。框架
Site 生命週期:
創建和發佈項目站點:pre-site
:生成項目站點以前須要完成的工做site
:生成項目站點文檔post-site
:生成項目站點以後須要完成的工做site-deploy
:將項目站點發布到服務器maven
各個生命週期相互獨立,一個生命週期的階段先後依賴。
mvn clean :調用 Clean 生命週期的 clean 階段,實際執行 pre-clean 和 clean 階段
mvn test :調用 Default 生命週期的 test 階段,實際執行 test 以及以前全部階段
mvn clean install :調用 Clean 生命週期的 clean 階段和 Default 生命週期 的 install 階段,實際執行 pre-clean 和 clean ,install 以及以前全部階段。
maven-clean-plugin
執行清理刪除已有target目錄;maven-resources-plugin
執行資源文件的處理;maven-compiler-plugin
編譯全部源文件生成class文件至targetclasses目錄下;maven-resources-plugin
執行測試資源文件的處理;maven-compiler-plugin
編譯測試目錄下的全部源代碼;maven-surefire-plugin
運行測試用例;遇到衝突的時候第一步,要找到 Maven 加載的到時是什麼版本的 jar 包,經過mvn dependency:tree
查看依賴樹,或者使用 IDEA Maven Helper 插件。
第二步,經過 Maven 的依賴原則來調整座標在 pom 文件的申明順序是最好的辦法,或者使用將衝突中不想要的 jar 引入的 jar刪掉。
依賴路徑最短優先原則
項目依賴了兩個jar包,其中A-B-C-D , A-D。因爲第二條路徑最短,因此項目使用的是第二個D。
pom文件中申明順序優先
項目依賴了兩個jar包,A-B-D ,A-C-D。maven會根據加載順序。若是先申明瞭B,在申明瞭C,那麼最後依賴就用A-C-D。
覆寫優先
子pom內聲明的優先於父pom中的依賴。
Maven倉庫有2種
Maven 會先搜索本地倉庫(repository),發現本地沒有而後從遠程倉庫(中央倉庫)獲取。私服是一種特殊的遠程倉庫,它是架設在局域網內的倉庫服務,私服代理廣域網上的遠程倉庫,供局域網內的 Maven 用戶使用。當 Maven 須要下載構件的時候,它從私服請求,若是私服上不存在該構件,則從外部的遠程倉庫下載,緩存在私服上以後,再爲 Maven 的下載請求提供服務。咱們還能夠把一些沒法從外部倉庫下載到的構件上傳到私服上。