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 ,不會有重大的功能變化

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章