Maven筆記之面試題合集
簡介:收集整理了網上關於Maven的面試問題,準備面試使用,答案通過各種資料查證編寫。
1.什麼是Maven?
Maven主要服務於基於java平台的項目構建,依賴管理和項目資訊管理。Maven項目對象模型(POM),可以通過一小段描述資訊來管理項目的構建,報告和文檔的項目管理工具軟體。它包含了一個項目對象模型,一組標準集合,一個項目生命周期,一個依賴管理系統和用來運行定義在生命周期階段中插件目標的邏輯。當使用Maven的時候,你用一個明確定義的項目對象模型來描述你的項目,然後Maven可以應用橫切的邏輯,這些邏輯來自於一組共享的(或自定義的)插件。
2.為什麼選用Maven進行構建?(能為我們解決什麼問題?)
①添加第三方jar包
按照最原始的做法,我們是手動複製jar包到項目WEB-INF/lib下,每個項目都會有一份,造成大量重複文件。而Maven將jar包放在本地倉庫中統一管理,需要jar包只需要用坐標的方式引用即可。
②jar包之間的依賴關係
jar包之間往往不是獨立的,很多jar需要在其他jar包的支援下才能夠正常工作,稱為jar包之間的依賴關係。如果我們手動去導入,要知道jar包之間的依賴關係並一一導入是及其麻煩而且容易出錯的。如果使用Maven,它能夠將當前jar包所依賴的其他所有jar包全部導入。
③獲取第三方jar包
開發過程中我們需要用到很多jar包,每個jar包在官網獲取的方式不盡相同,給工作帶來了額外困難。但是使用Maven可以以坐標的方式依賴一個jar包,Maven從中央倉庫進行下載,並同時下載這個jar包依賴的其他jar包。
④將項目拆分為多個工程模組
項目的規模越來越大,已經不可能通過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 ,不會有重大的功能變化