簡介:收集整理了網上關於Maven的面試問題,準備面試使用,答案經過各類資料查證編寫。java
1.什麼是Maven?web
Maven主要服務於基於java平臺的項目構建,依賴管理和項目信息管理。Maven項目對象模型(POM),能夠經過一小段描述信息來管理項目的構建,報告和文檔的項目管理工具軟件。它包含了一個項目對象模型,一組標準集合,一個項目生命週期,一個依賴管理系統和用來運行定義在生命週期階段中插件目標的邏輯。當使用Maven的時候,你用一個明肯定義的項目對象模型來描述你的項目,而後Maven能夠應用橫切的邏輯,這些邏輯來自於一組共享的(或自定義的)插件。面試
2.爲何選用Maven進行構建?(能爲咱們解決什麼問題?)api
①添加第三方jar包tomcat
按照最原始的作法,咱們是手動複製jar包到項目WEB-INF/lib下,每一個項目都會有一份,形成大量重複文件。而Maven將jar包放在本地倉庫中統一管理,須要jar包只須要用座標的方式引用便可。服務器
②jar包之間的依賴關係網絡
jar包之間每每不是獨立的,不少jar須要在其餘jar包的支持下才可以正常工做,稱爲jar包之間的依賴關係。若是咱們手動去導入,要知道jar包之間的依賴關係並一一導入是及其麻煩並且容易出錯的。若是使用Maven,它可以將當前jar包所依賴的其餘全部jar包所有導入。架構
③獲取第三方jar包框架
開發過程當中咱們須要用到不少jar包,每一個jar包在官網獲取的方式不盡相同,給工做帶來了額外困難。可是使用Maven能夠以座標的方式依賴一個jar包,Maven從中央倉庫進行下載,並同時下載這個jar包依賴的其餘jar包。eclipse
④將項目拆分爲多個工程模塊
項目的規模愈來愈大,已經不可能經過package結構來劃分模塊,必須將項目拆分爲多個工程協同開發。
3.Maven的優勢
①簡化了項目依賴管理
②易於上手,對於新手來講了解幾個經常使用命令便可知足平常工做
③便於與持續集成工具(jenkins)整合
④便於項目升級,不管是項目自己仍是項目使用的依賴
⑤maven有不少插件,便於功能擴展,好比生產站點,自動發佈版本等
⑥爲何使用Maven中的各點
4.Maven的缺點
①Maven是一個龐大的構建系統,學習難度大。(不少均可以這樣說,入門容易[優勢]可是精通難[缺點])
②Maven採用約定約定優於配置的策略,雖然上手容易可是一旦出現問題,難於調試
③中國網絡環境較差,不少repository沒法訪問
5.什麼是Maven的座標
Maven的座標經過groupId,artifactId,version惟一標誌一個構件。groupId一般爲公司或組織名字,artifactId一般爲項目名稱,versionId爲版本號。
6.經過座標如何定位地址
加上groupId爲org.codehaus.mojo,artifactId爲myproject,versionId爲v1.0.0,則對應地址爲:倉庫目錄(.m2)/org/codehaus/mojo/myproject/v1.0.0
7.Maven的依賴範圍有哪些(在scope中指定)
compile:默認範圍,若是未指定任何範圍,則使用該範圍。編譯依賴項在全部(編譯,測試,運行)類路徑中均可用。此外,這些依賴關係會傳播到依賴的項目
provided:這很像compile,但表示您但願JDK或容器在運行時提供它。它只在編譯和測試類路徑上可用,不可傳遞。
runtime:此範圍表示編譯不須要依賴項,但須要執行依賴項。它在運行時和測試類路徑中,但不在編譯類路徑中。(servlet-api)
test:表示應用程序的正常使用不須要依賴項,而且僅在測試編譯和執行階段可用。它不是傳遞的。(jdbc)
system:系統依賴範圍。該依賴與三種classpath的關係和provided依賴範圍徹底一致。可是,使用system範圍的依賴時必須經過systemPath元素顯式地指定依賴文件的路徑。因爲此類依賴不是經過Maven倉庫解析的,並且每每與本機系統綁定,可能形成構建的不可移植。
8.Maven生命週期
有三套什麼週期,分別爲clean,default,site
clean:
今生命週期旨在給工程作清理工做,它主要包含如下階段:
pre-clean - 執行項目清理前所須要的工做。
clean - 清理上一次build項目生成的文件。
post-clean - 執行完成項目清理所需的工做。
default:
validate - 驗證項目是否正確且全部必要的信息均可用。
initialize - 初始化構建工做,如:設置參數,建立目錄等。
generate-sources - 爲包含在編譯範圍內的代碼生成源代碼.
process-sources - 處理源代碼, 如過濾值.
generate-resources -
process-resources - 複製並處理資源文件,至目標目錄,準備打包。
compile - 編譯項目中的源代碼.
process-classes - 爲編譯生成的文件作後期工做, 例如作Java類的字節碼加強.
generate-test-sources - 爲編譯內容生成測試源代碼.
process-test-sources - 處理測試源代碼。
generate-test-resources -
process-test-resources - 複製並處理資源文件,至目標測試目錄。
test-compile - 將需測試源代碼編譯到路徑。通常來講,是編譯/src/test/java目錄下的java文件至目標輸出的測試classpath目錄中。
process-test-classes -
test - 使用合適的單元測試框架運行測試。這些測試代碼不會被打包或部署。
prepare-package -
package - 接受編譯好的代碼,打包成可發佈的格式,如 JAR 。
pre-integration-test -
integration-test - 按需求將發佈包部署到運行環境。
post-integration-test -
verify -
install -將包安裝到本地倉庫,給其餘本地引用提供依賴。
deploy -完成集成和發佈工做,將最終包複製到遠程倉庫以便分享給其餘開發人員。
site:
pre-site - 執行一些生成項目站點前的準備工做。
site - 生成項目站點的文檔。
post-site - 執行需完成站點生成的工做,如站點部署的準備工做。
site-deploy - 向制定的web服務器部署站點生成文件。
9.Maven命令
mvn archetype:generate 建立Maven項目
mvn compile 編譯源代碼
mvn deploy 發佈項目
mvn test-compile 編譯測試源代碼
mvn test 運行應用程序中的單元測試
mvn site 生成項目相關信息的網站
mvn clean 清除項目目錄中的生成結果
mvn package 根據項目生成的jar
mvn install 在本地Repository中安裝jar
mvn eclipse:eclipse 生成eclipse項目文件
mvnjetty:run 啓動jetty服務
mvntomcat:run 啓動tomcat服務
mvn clean package -Dmaven.test.skip=true:清除之前的包後從新打包,跳過測試類
10.依賴的解析機制
當依賴的範圍是 system 的時候,Maven 直接從本地文件系統中解析構件。
根據依賴座標計算倉庫路徑,嘗試直接從本地倉庫尋找構件,若是發現對應的構件,就解析成功。
若是在本地倉庫不存在相應的構件,就遍歷全部的遠程倉庫,發現後,下載並解析使用。
若是依賴的版本是 RELEASE 或 LATEST,就基於更新策略讀取全部遠程倉庫的元數據文件(groupId/artifactId/maven-metadata.xml),將其與本地倉庫的對應元合併後,計算出 RELEASE 或者 LATEST 真實的值,而後基於該值檢查本地倉庫,或者從遠程倉庫下載。
若是依賴的版本是 SNAPSHOT,就基於更新策略讀取全部遠程倉庫的元數據文件,將它與本地倉庫對應的元數據合併,獲得最新快照版本的值,而後根據該值檢查本地倉庫,或從遠程倉庫下載。
若是最後解析獲得的構件版本包含有時間戳,先將該文件下載下來,再將文件名中時間戳信息刪除,剩下 SNAPSHOT 並使用(以非時間戳的形式使用)。
11.插件的解析機制
與依賴的構件同樣,插件也是基於座標保存在Maven倉庫中。在用到插件的時候會先從本地倉庫查找插件,若是本地倉庫沒有則從遠程倉庫查找插件並下載到本地倉庫。與普通的依賴構件不一樣的是,Maven會區別對待普通依賴的遠程倉庫與插件的遠程倉庫。前面提到的配置遠程倉庫只會對普通的依賴有效果。當Maven須要的插件在本地倉庫不存在時是不會去咱們之前配置的遠程倉庫查找插件的,而是須要有專門的插件遠程倉庫。
12.如何聚合多模塊
配置一個打包類型爲pom的聚合模塊,而後在該pom中使用<module>元素聲明要聚合的模塊。
13.如何管理多模塊項目依賴的版本
經過在父模塊中聲明dependencyManagement和pluginManagement, 而後讓子模塊經過<parent>元素指定父模塊,這樣子模塊在定義依賴是就能夠只定義groupId和artifactId,自動使用父模塊的version,這樣統一整個項目的依賴的版本。
14.如何解決依賴傳遞引發的版本衝突
可經過dependency的exclusion元素排除掉依賴
15.Maven依賴原則
①最短路徑原則(依賴傳遞的路徑越短越優先)
②pom文件申明順序優先(路徑長度同樣,則先申明的優先)
③覆寫原則(當前pom文件裏申明的直接覆蓋父工程傳過來的)
16.Maven版本規則
主版本.次版本.增量版本
主版本:通常來講表明了項目的重大的架構變動
次版本:通常表明了一些功能的增長或變化,但沒有架構的變化
增量版本:通常是一些小的 bug fix ,不會有重大的功能變化