Maven 入門——認識Maven結構
1、settings.xml 元素解讀
localRepository
該元素表示本地 Maven 倉庫的地址,不設置的話,默認為 ~/.m2/repository
pluginGroups
將插件的信息註冊到 Maven 中,是的執行 Maven plugin 命令的時候可以不指定 groupId 和 artifactId,比如:
這個生成源代碼的插件,運行的時候不需要指定它的 groupId 和 artifactId,只需要執行mybatis-generator:generate
即可,因為這個插件的信息屬於默認的兩個插件組 org.apache.maven.plugins
和org.codehaus.mojo
servers
配置的私服的登錄信息,比如
username
、password
等服務器的認證信息,也可以設置權限信息。mirrors
遠端的中央倉庫,有時候下載第三方的 jar 包比較慢,可以更改為國內的一些鏡像倉庫,比如阿裏雲的倉庫:
如果是公司內部使用的 jar 包,可以放在自己搭建的私服上面,這裏配置成自己的私服地址即可。
profiles、activeProfiles
其作用主要用於區分環境用的,也可以定義一些倉庫,用來搜索需要的發布版或者快照版來構建,這個配置中的 profile,如果在激活列表裏邊存在,則這些 profile 將會覆蓋 pom.xml 中的相同 id 的 profile。
2、pom.xml 元素解讀
modelVersion
如果使用的是 Maven 3.0 及以上的版本,這裏的值默認都是 4.0.0,而這個值來自哪裏呢,在 Maven 安裝目錄裏 lib 目錄裏邊的 /lib/maven-model-builder-3.5.4.jar
,解壓之後,進入到目錄 org/apache/maven/model
裏邊,會看到一個 pom.xml 文件:
而且,繼續往下看,你就會發現,為什麽用 IDEA 生成的 Maven 項目,它的目錄結構是約定好的,約定的配置就是這個 super pom,這樣只要是使用 Maven 開發的項目,其目錄結果都是一樣的,這種思想就是常常聽說的Convention Over Configuration
groupId
定義當前 Maven 項目隸屬的實際項目,由於經常會有多模塊的 Maven 項目,所以 Maven 項目與實際項目不一定是一對一的關系,因此,
groupId
不應該對應項目隸屬的組織或公司,應該到具體的項目;實際的表示方式也應該與 Java 包名的表示方式類似,通常與域名反向一一對應。artifactId
該元素定義實際項目中的一個 Maven 項目(模塊),推薦的做法是使用實際項目名稱作為 artifactId 的前綴,這樣做的好處是方便尋找實際構件。
version
該元素定義 Maven 項目當前所處的版本。
packaging
打包方式,默認為 jar。
properties
用於定義一些配置常量,比如依賴的版本號。
dependencyManagement
該元素只能出現在父 pom.xml 中,其作用是為了統一版本號,而且這裏的依賴只是一個聲明,子 pom.xml 裏用到其中某一個的時候,再去顯式地引用。
dependency
引用依賴,其中的配置有如下幾個:
- type,默認為 jar
- scope 表示其作用範圍,有如下幾個範圍:
- compile,編譯時依賴,也是默認的依賴範圍,編譯、測試和運行都需要,比如** spring-core**
- test,測試時依賴,只在測試階段需要,比如** spring-test**
- provided,編譯時依賴,只在編譯時需要,比如servlet
- runtime,運行時依賴,只在運行時需要,比如JDBC驅動類
- system,本地的一些 jar,比如短信的 jar 包,常用 ** systemPath**一起使用
- exclusions,用來** 排除**由於傳遞依賴引入(參考第三小節)的但是是不需要的依賴
optional,可選依賴,默認為 false,用於放置依賴傳遞,當一個項目 A 依賴另一個項目 B 時,項目 A 可能很少一部分功能用到了項目 B,此時就可以在 A 中配置對 B 的可選依賴y
3、傳遞性依賴
傳遞性依賴可以減少一些引用的依賴,可以進行隱式地依賴,但是如果需要控制版本,最好的方式是,先排除該依賴,再顯式地引用該依賴,依賴關系如下圖:
4、依賴仲裁
如果根據傳遞性依賴,同時依賴了兩次某一個 jar 包,例如,項目 A 有這樣的依賴關系:A -> B -> C -> X(1.0)、A -> D -> X(2.0),X 是 A 的傳遞性依賴,那麽哪個 X 會被 Maven 解析使用呢,Maven 依賴仲裁(Maven Mediation)的第一原則是:路徑最近者優先,該例中 X(1.0) 的路徑長度為 3,而 X(2.0) 的路徑長度為 2,因此 X(2.0) 會被解析使用。
再比如這樣的依賴關系:A -> B -> Y(1.0),A -> C -> Y(2.0),Y(1.0) 和 Y(2.0) 的依賴路徑長度是一樣的,都為 2,根據 Maven 依賴仲裁(Maven Mediation)的第二原則:第一聲明者優先,在 POM 中依賴聲明的順序決定了誰會被解析使用,順序最靠前的那個依賴優先被解析,所以 Y(2.0) 就會被解析使用。5、優化依賴
mvn dependency:analyze
使用但未聲明的依賴(Used undeclared dependencies),建議顯示聲明
聲明但未使用的依賴(Unused declared dependencies),有可能是運行時使用的
Maven 入門——認識Maven結構