1. 程式人生 > >Maven 入門——認識Maven結構

Maven 入門——認識Maven結構

常用 5.4 aging 1.0 前綴 而且 放置 3.0 顯式

1、settings.xml 元素解讀

localRepository
該元素表示本地 Maven 倉庫的地址,不設置的話,默認為 ~/.m2/repository
pluginGroups
將插件的信息註冊到 Maven 中,是的執行 Maven plugin 命令的時候可以不指定 groupId 和 artifactId,比如:
技術分享圖片
這個生成源代碼的插件,運行的時候不需要指定它的 groupId 和 artifactId,只需要執行mybatis-generator:generate 即可,因為這個插件的信息屬於默認的兩個插件組 org.apache.maven.pluginsorg.codehaus.mojo

其中的一個,如果是其他的話,則需要顯式地配置一下。
servers
配置的私服的登錄信息,比如 usernamepassword等服務器的認證信息,也可以設置權限信息。
mirrors
遠端的中央倉庫,有時候下載第三方的 jar 包比較慢,可以更改為國內的一些鏡像倉庫,比如阿裏雲的倉庫:

如果是公司內部使用的 jar 包,可以放在自己搭建的私服上面,這裏配置成自己的私服地址即可。
profilesactiveProfiles
其作用主要用於區分環境用的,也可以定義一些倉庫,用來搜索需要的發布版或者快照版來構建,這個配置中的 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結構