1.Maven坐標(biāo)
????Maven定義了一組規(guī)則脆栋,用于標(biāo)識(shí)構(gòu)件的唯一性倦卖。這些元素包括:groupId洒擦、artifactId、version糖耸、packaging秘遏、classifier。通過(guò)這些元素我們就可以找到對(duì)應(yīng)的構(gòu)件嘉竟。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.3.RELEASE</version>
<packaging>jar</packaging>
<scope>...</scope>
<optional>...</optional>
<exclusions>...</exclusions>
</dependency>
- 1.groupId
定義當(dāng)前Maven項(xiàng)目隸屬于的實(shí)際項(xiàng)目邦危,通常定義為公司域名的倒寫(xiě)加實(shí)際項(xiàng)目簡(jiǎn)寫(xiě)。比如阿里巴巴(com.alibab.dubbo)
- 2.artifactId
該元素定義實(shí)際項(xiàng)目中的一個(gè)Maven項(xiàng)目模塊舍扰,通常做法是使用實(shí)際項(xiàng)目名稱(chēng)作為artifactId的前綴倦蚪。比如(dubbo-client)
- 3.version
該元素定義Maven項(xiàng)目當(dāng)前所處的版本。通常命名方式為:主版本號(hào).次版本號(hào).修訂號(hào)边苹。(主版本號(hào):產(chǎn)品方向改變陵且,或者大規(guī)模API不兼容。次版本號(hào):保持相對(duì)兼容个束,增加主要功能特性慕购。修訂號(hào):保持完全兼容性,修復(fù)BUG茬底、新增次要功能)起始版本為1.0.0
- 4.packaging
該元素定義Maven的打包方式沪悲。jar生成jar包,war生成war包阱表,pom就是作為父子工程的父工程殿如,僅僅引用pom。
- 5.scope
依賴(lài)范圍
- 6.optional
標(biāo)記依賴(lài)是否可選
- 7.exclusions
用來(lái)排除傳遞依賴(lài)
2.依賴(lài)范圍
????依賴(lài)范圍是用來(lái)控制引入的jar與classpath的關(guān)系最爬。(編譯時(shí)的classpath涉馁、測(cè)試的classpath、運(yùn)行classpath)
- 1.compile
編譯依賴(lài)范圍爱致。如果沒(méi)有指定scope類(lèi)型烤送,默認(rèn)為compile。此依賴(lài)范圍的Maven范圍對(duì)編譯糠悯、測(cè)試胯努、運(yùn)行三種classpath都有效
- 2.test
測(cè)試依賴(lài)范圍。此依賴(lài)范圍的Maven依賴(lài)逢防,只對(duì)測(cè)試classpath有效叶沛。在編譯主代碼或者運(yùn)行項(xiàng)目使用時(shí)無(wú)法使用此類(lèi)Maven依賴(lài)。
- 3.provided
已提供依賴(lài)忘朝。使用此依賴(lài)范圍的Maven依賴(lài)灰署,對(duì)于編譯和測(cè)試classpath都有效。但是在運(yùn)行時(shí)無(wú)效。eg:servlet-api溉箕。
因?yàn)橥ǔava web程序都是運(yùn)行在容器里面了晦墙,比如tomcat,而tomcat已經(jīng)提供了此依賴(lài)肴茄,故無(wú)須再引入晌畅。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
<scope>provided</scope>
</dependency>
- 4.runtime
運(yùn)行時(shí)依賴(lài)范圍。使用此依賴(lài)范圍的Maven依賴(lài)寡痰,對(duì)于測(cè)試和運(yùn)行classpath有效抗楔,但是在編譯主代碼無(wú)效。比如JDBC驅(qū)動(dòng)實(shí)現(xiàn)拦坠。因?yàn)橹鞔a編譯的只需要JDK提供的JDBC接口连躏。只有在執(zhí)行和測(cè)試需要具體的實(shí)現(xiàn)類(lèi)
3.傳遞性依賴(lài)
????比如我們?cè)谝肧pring框架jar包的時(shí)候,在引入Spring Context jar包的時(shí)候贞滨,就無(wú)須引入spring-aop入热,或者spring-beans等等。因?yàn)镸aven將這種傳遞依賴(lài)已經(jīng)默認(rèn)給我們加載好了晓铆。
4.排除依賴(lài)
????傳遞性依賴(lài)會(huì)給項(xiàng)目隱式地引入很多依賴(lài)勺良,這極大地簡(jiǎn)化了項(xiàng)目依賴(lài)的管理。但是有有時(shí)候也會(huì)帶來(lái)問(wèn)題骄噪。比如:當(dāng)前項(xiàng)目有依賴(lài)了第三方依賴(lài)郑气,但是第三方依賴(lài)了另一個(gè)不穩(wěn)定的版本。這樣不穩(wěn)定性就會(huì)傳遞給本項(xiàng)目腰池。這時(shí)候就需要排除不穩(wěn)定的版本依賴(lài)。
<dependency>
<groupId>com.icegreen</groupId>
<artifactId>greenmail</artifactId>
<version>1.5.6</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
</exclusion>
</exclusions>
</dependency>
5.歸類(lèi)依賴(lài)
????如果項(xiàng)目依賴(lài)同一個(gè)項(xiàng)目的不同的模塊忙芒,依賴(lài)的版本的都相同示弓,則為了便于管理,使用properties元素定義Maven屬性呵萨,比如spring項(xiàng)目奏属。
<properties>
<spring.version>4.3.14.RELEASE</spring.version>
</properties>
????定義了上述的屬性,則在Maven運(yùn)行的時(shí)候會(huì)將POM文件所有的${spring.version}替換掉潮峦。
6.優(yōu)化依賴(lài)
????在軟件開(kāi)發(fā)過(guò)程中囱皿,會(huì)不斷優(yōu)化自己的代碼。比如對(duì)Maven依賴(lài)忱嘹,要及時(shí)去除多余的依賴(lài)嘱腥。
查看當(dāng)前項(xiàng)目的已解析的依賴(lài)
mvn dependency:list
以tree的形式展示已解析的依賴(lài)
mvn dependency:tree
查看未聲明的依賴(lài)于聲明但未使用的依賴(lài)
mvn dependency:analyze
[WARNING] Used undeclared dependencies found:
[WARNING] org.springframework:spring-context:jar:4.3.14.RELEASE:compile
[WARNING] org.springframework:spring-beans:jar:4.3.14.RELEASE:compile
[WARNING] Unused declared dependencies found:
[WARNING] com.icegreen:greenmail:jar:1.5.6:test
????上面就是指項(xiàng)目中使用到的,但是沒(méi)有顯式申明的依賴(lài)拘悦,這里使用了未申明的spring-context齿兔。==這種依賴(lài)意味著潛在的風(fēng)險(xiǎn)。== 因?yàn)樯?jí)依賴(lài)的時(shí)候,相關(guān)傳遞性依賴(lài)的版本發(fā)生了變化分苇,但是不易察覺(jué)添诉。==容易導(dǎo)致項(xiàng)目出現(xiàn)錯(cuò)誤。==