Maven坐標和依賴(三)

jopen 8年前發布 | 10K 次閱讀 Maven 項目構建

接下來介紹一下Maven的坐標和依賴。

1. Maven坐標

  依賴的底層基礎就是坐標。在實際生活中我們可以將地址看成一種坐標。而Maven為構件引入坐標的概念。以前當我們需要Spring Framework依賴的時候,就回去Spring官網查找,當需要log4j的依賴時,我們又回去Apache網站查找,這樣就花費大量的時間在搜索、瀏覽網頁上。現在Maven定義了一組規則:世界上任何一個構件都可以使用Maven坐標唯一標識。Maven坐標元素包括:groupId, artifactId, version, packaging, classifier。

2. 坐標詳解

1)groupId: 定義當前Maven項目隸屬的實際項目。groupId的表示方式與Java報名的表示方式類似,通常與域名反向一一對應。如:org.springframework.
2)artifactId: 該元素定義實際項目的一個Maven項目(模塊),推薦使用實際項目名稱作為artifactId的前綴。如:spring-core. 默認情況下Maven生成的構件會以artifactId作為開頭,如spring-core-3.1.0.jar。
3)version: 該元素定義Maven項目當前所處的項目的版本。
4)packaging: 該元素定義Maven項目的打包方式。當不定義packaging的時候,Maven會使用默認值jar。
5)classifier: 該元素用來幫助定義構建輸出的一些附屬軟件。
以上5個元素中,groupId、artifactId、version是必須定義的,packaging是可選的,而classifier是不能直接定義的。

3. 依賴配置

<project>
  <dependencies>
    <dependency>
      <groupId>...</groupId>
      <artifactId>...</artifactId>
      <version>...</version>
      <type>...</type>
      <scope>...</scope>
      <optional>...</optional>
      <exclusions>
        <exclusion>
        ...
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>
</project>

每個依賴都包括的元素有:
groupId、artifactId和version:依賴的基本坐標。
type: 依賴的類型,對應于項目坐標定義的packagin。大多情況下不必聲明。
scope: 依賴的范圍。
optional: 標記依賴時候可選。
exclusions: 用來配出傳遞性依賴。

4. 依賴范圍

1)compile:編譯依賴范圍。該依賴對于編譯、測試、運行三種classpath都有效。如spring-core。

2)test:測試依賴范圍。只對測試范圍classpath有效。經典的例子是JUnit。

3)provided:已提供依賴范圍,對編譯和測試classpath有效,但在運行時無效。典型的例子是servlet-api,在編譯和測試項目的時候需要該依賴,但是在運行項目時,由于容器已經提供,就不要重復引入。

4)runtime:運行時依賴。對于測試和運行classpath有效。典型的例子是JDBC驅動實現,項目主代碼的編譯只需要JDK提供的JDBC接口,只有在執行測試或者運行項目的時候才需要實現上述接口。

5)system:系統依賴范圍。與classpath的關系和provided一樣。

6)import:導入依賴范圍。該依賴范圍不會對三種classpath產生實際的影響。

5. 依賴的傳遞性

顧名思義,很多人都知道A->B, B->C,那么A->C.但是在Maven中傳遞的范圍是會改變的,這個由maven自身處理。如下圖:
第一列為第一依賴,第一行為第二依賴,單元格內為傳遞范圍。


compile test provided runtime
compile compile - - runtime
test test - - test
provided provided - provided provided
runtime runtime - - runtime

6. 依賴調解

如果有多個相同的依賴,Maven會根據一定的規則來確定:
傳遞路徑長度取最短原則,傳遞路徑長度相等時,采取最先申明原則。

7. 排除依賴


依賴包里有些包不穩定,可以排除該依賴包,如:
<dependency>
  <groupId>javax.mail</groupId>
  <artifactId>mail</artifactId>
  <version>1.4.1</version>
  <exclusions>
    <exclusion>
      <groupId>javax.activation</groupId>
      <artifactId>activation</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>javax.activation</groupId>
  <artifactId>activation</artifactId>
  <version>1.1</version>
</dependency>


8. 分類依賴

當同一個模塊,所依賴的幾個模塊版本都相同時,可以使用maven里的屬性做分類依賴,依賴版本升級時改一處即可。

<properties>
  <springframework.version>3.2.5</springframework.version>
</properties>
<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${springframework.version}</version>
    <type>jar</type>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${springframework.version}</version>
    <type>pom</type>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${springframework.version}</version>
    <type>jar</type>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>${springframework.version}</version>
    <type>jar</type>
    <scope>compile</scope>
  </dependency>
</dependencies>


9. 優化依賴


1) mvn dependency:list

查出依賴列表
2) mvn dependency:tree
查出依賴列表,按tree排列
3) mvn dependency:analyze
查找出在編譯和測試中未使用但顯示聲明的依賴  

來自: http://my.oschina.net/liangbo/blog/178753

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!