【026期】Java工具面試題(二):項目管理工具

開篇介紹

你們好,我是Java最全面試題庫的提褲姐,今天這篇是Java工具系列的第二篇,主要總結了maven相關的問題,在後續,會沿着第一篇開篇的知識線路一直總結下去,作到日更!若是我能作到百日百更,但願你也能夠跟着百日百刷,一百天養成一個好習慣。java

什麼是maven?

Maven是基於POM(工程對象模型),經過一小段描述來對項目的代碼、報告、文件進管理的工具。
Maven是一個跨平臺的項目管理工具,它是使用java開發的,它要依賴於jdk1.6及以上
Maven主要有兩大功能:管理依賴項目構建。(依賴指的是jar包)web

maven優缺點?

優勢:面試

  • 簡化了項目構建,依賴管理:
  • 易於上手
  • 便於與持續集成工具(Jenkins)整合
  • 便於項目升級,不管是項目自己升級仍是項目使用的依賴升級。
  • 有助於多模塊項目的開發,一個模塊開發好後,發佈到倉庫,依賴該模塊時能夠直接從倉庫更新,而不用本身去編譯。
  • maven有不少插件,便於功能擴展,好比生產站點,自動發佈版本等

缺點:spring

  • maven是一個龐大的構建系統,學習難度大。
  • maven採用約定優於配置的策略(convention over configuration),雖然上手容易,可是一旦出了問題,難於調試。
  • 中國的網絡環境差,不少repository沒法訪問,好比google code, jboss 倉庫沒法訪問等。

maven常見的依賴範圍有哪些?

  • compile:編譯依賴,默認的依賴方式,在編譯(編譯項目和編譯測試用例),運行測試用例,運行(項目實際運行)三個階段都有效,典型地有spring-core等jar。
  • test:測試依賴,只在編譯測試用例和運行測試用例有效,典型地有JUnit。
  • provided:對於編譯和測試有效,不會打包進發布包中,典型的例子爲servlet-api,通常的web工程運行時都使用容器的servlet-api。
  • runtime:只在運行測試用例和實際運行時有效,典型地是jdbc驅動jar包。
  • system:不從maven倉庫獲取該jar,而是經過systemPath指定該jar的路徑。
  • import:用於一個dependencyManagement對另外一個dependencyManagement的繼承。

maven 座標的含義?

groupId :定義當前 Maven 項目隸屬的實際項目。
artifactId :該元素定義當前實際項目中的一個 Maven 項目(模塊)。推薦的作法是使用實際項目名稱做爲 artifactId 的前綴。好比上例中的 junit ,junit 就是實際的項目名稱,方便並且直觀。在默認狀況下,Maven 生成的構件,會以 artifactId 做爲文件頭。例如 junit-3.8.1.jar ,使用實際項目名稱做爲前綴,就能方便的從本地倉庫找到某個項目的構件。
version :該元素定義了使用構件的版本。
packaging :定義 Maven 項目打包的方式,使用構件的什麼包。打包方式一般與所生成構件的文件擴展名對應。
classifier :該元素用來幫助定義構建輸出的一些附件。附屬構件與主構件對應。api

maven 經常使用命令?

  • 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構建的過程?

清理 ->編譯 ->測試 ->報告 ->打包 ->部署緩存

maven的生命週期?

Maven有三套相互獨立的生命週期,分別是 CleanDefaultSite。每一個生命週期包含一些階段,階段是有順序的,後面的階段依賴於前面的階段。服務器

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 以及以前全部階段。

使用「mvn clean package」命令進行項目打包,該命令具體作了什麼?

  • 使用清理插件: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刪掉。

Maven依賴原則?

依賴路徑最短優先原則
項目依賴了兩個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倉庫?

Maven倉庫有2種

  • 本地倉庫
  • 遠程倉庫

Maven 會先搜索本地倉庫(repository),發現本地沒有而後從遠程倉庫(中央倉庫)獲取。私服是一種特殊的遠程倉庫,它是架設在局域網內的倉庫服務,私服代理廣域網上的遠程倉庫,供局域網內的 Maven 用戶使用。當 Maven 須要下載構件的時候,它從私服請求,若是私服上不存在該構件,則從外部的遠程倉庫下載,緩存在私服上以後,再爲 Maven 的下載請求提供服務。咱們還能夠把一些沒法從外部倉庫下載到的構件上傳到私服上。

相關文章
相關標籤/搜索