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
查找出在編譯和測試中未使用但顯示聲明的依賴