天天看點

面試必備:Maven核心知識點梳理

Maven是一個項目管理工具,它包含了一個項目對象模型 (Project Object Model),一組标準集合,一個項目生命周期(Project Lifecycle),一個依賴管理系統(Dependency Management System),和用來運作定義在生命周期階段(phase)中插件(plugin)目标(goal)的邏輯。

依賴管理:Maven工程對jar包的管理過程。

一個複雜的項目将會包含很多依賴,也有可能包含依賴于其它構件的依賴。這是Maven最強大的特征之一,它支援了傳遞性依賴(transitive dependencies)。假如你的項目依賴于一個庫,而這個庫又依賴于五個或者十個其它的庫(就像Spring或者Hibernate那樣)。你不必找出所有這些依賴然後把它們寫在你的pom.xml裡,你隻需要加上你直接依賴的那些庫,Maven會隐式的把這些庫間接依賴的庫也加入到你的項目中。Maven也會處理這些依賴中的沖突,同時能讓你自定義預設行為,或者排除一些特定的傳遞性依賴。

項目建構:<code>mvn tomcat:run</code>

本地倉庫、遠端倉庫(私服)、中央倉庫

本地倉庫預設為{user.home}.m2.repority,可以在配置檔案中修改

核心代碼部分:<code>src/main/java</code>

配置檔案部分:<code>src/main/resources</code>

測試代碼部分:<code>src/test/java</code>

測試配置檔案:<code>src/test/resources</code>

頁面資源(包含js,css,圖檔資源等):<code>src/main/webapp</code>

clean:删除項目中已經編譯好的資訊,删除target目錄

compile:Maven工程的編譯指令,用于編譯項目的源代碼,将<code>src/main/java</code>下的檔案編譯成class檔案輸出到target目錄下。

test:使用合适的單元測試架構運作測試。

package:将編譯好的代碼打包成可分發的格式,如JAR,WAR。

install:安裝包至本地倉庫,以備本地的其它項目作為依賴使用。

deploy:複制最終的包至遠端倉庫,共享給其它開發人員和項目(通常和一次正式的釋出相關)。

每一個建構項目的指令都對應了maven底層一個插件。

mvn clean package依次執行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7個階段。

mvn clean install依次執行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等8個階段。

mvn clean deploy依次執行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy等9個階段。

主要差別:

package指令完成了項目編譯、單元測試、打包功能,但沒有把打好的可執行jar包(war包或其它形式的包)布署到本地maven倉庫和遠端maven私服倉庫。

install指令完成了項目編譯、單元測試、打包功能,同時把打好的可執行jar包(war包或其它形式的包)布署到本地maven倉庫,但沒有布署到遠端maven私服倉庫。

deploy指令完成了項目編譯、單元測試、打包功能,同時把打好的可執行jar包(war包或其它形式的包)布署到本地maven倉庫和遠端maven私服倉庫。 

清理生命周期:運作mvn clean将調用清理生命周期 。

預設生命周期:是一個軟體應用程式建構過程的總體模型 。

compile,test,package,install,deploy

站點生命周期:為一個或者一組項目生成項目文檔和報告,使用較少。

面試必備:Maven核心知識點梳理

項目對象模型(Project Object Model,POM),對應着Maven項目中的pom.xml檔案

項目自身資訊

項目運作所依賴的jar包資訊,如:

<code>&lt;groupId&gt;</code>:團體,公司,小組,組織,項目,或者其它團體。團體辨別的約定是,它以建立這個項目的組織名稱的逆向域名(reverse domain name)開頭。

<code>&lt;artifactId&gt;</code>:項目的唯一辨別符

<code>version</code>:項目的版本

<code>package</code>:項目的類型,預設是jar,描述了項目打包後的輸出 。

項目運作環境資訊,比如:jdk,tomcat資訊

依賴範圍

compile:預設的範圍,編譯測試運作都有效。

provided:編譯和運作有效,最後在運作的時候不會加入。官方舉了一個例子。比如在JavaEE web項目中我們需要使用servlet的API,但是Tomcat中已經提供這個jar,我們在編譯和測試的時候需要使用這個api,但是部署到tomcat的時候,如果還加入servlet建構就會産生沖突,這個時候就可以使用provided。

runtime:測試和運作有效。

test:測試有效。

system:與本機系統關聯,編譯和測試時有效。

import:導入的範圍,它隻在使用dependencyManagement中,表示從其他pom中導入dependecy的配置。

每個顯式聲明的類包都會依賴于一些其它的隐式類包,這些隐式的類包會被maven間接引入進來,因而可能造成一個我們不想要的類包的載入,嚴重的甚至會引起類包之間的沖突。

要解決這個問題,首先就是要檢視pom.xml顯式和隐式的依賴類包,然後通過這個類包樹找出我們不想要的依賴類包,手工将其排除在外就可以了。 例如:

由于部落客也是在攀登的路上,文中可能存在不當之處,歡迎各位多指教! 如果文章對您有用,那麼請點個”推薦“,以資鼓勵!