Maven在編譯绳姨,測試和運(yùn)行時(shí)使用的是不同的ClassPath, 所以Maven通過dependency的scope來定義不同的classpath應(yīng)該包含哪些依賴污桦。
定義依賴
- compile: 編譯依賴范圍。如果沒有指定,聚會(huì)默認(rèn)使用該依賴范圍蚕愤,使用此依賴范圍的Maven依賴,對(duì)于編譯饺蚊、測試和運(yùn)行三種classpath都有效萍诱。在編譯、測試和運(yùn)行的時(shí)候都要使用該依賴
- test:測試依賴范圍污呼。 是用此依賴范圍的Maven依賴裕坊,只對(duì)于測試classpath有效,在編譯主代碼或者運(yùn)行項(xiàng)目時(shí)將無法使用此依賴燕酷。
- provided: 已提供依賴范圍籍凝,對(duì)于編譯和測試classpath有效,但是在運(yùn)行時(shí)無效苗缩。編譯和測試項(xiàng)目的時(shí)候需要該依賴饵蒂,但是在運(yùn)行該項(xiàng)目的時(shí)候,由系統(tǒng)提供酱讶,所以不需要maven重復(fù)引入退盯。
- runtime: 運(yùn)行時(shí)依賴范圍,對(duì)于runtime和測試classpath有效泻肯,但是在編譯代碼時(shí)無效渊迁,典型的就是JDBC的驅(qū)動(dòng)實(shí)現(xiàn),項(xiàng)目在編譯時(shí)候只需要使用JDK提供的JDBC接口灶挟,只有在執(zhí)行測試或者運(yùn)行的時(shí)候才需要JDBC具體的驅(qū)動(dòng)實(shí)現(xiàn)琉朽。
5: system: 系統(tǒng)依賴范圍,該依賴與provided的依賴范圍是一只的膏萧,但是漓骚,使用system依賴范圍必須通過systemPath元素顯式的指定依賴文件的路徑蝌衔。此依賴不是通過maven倉庫解析,而是與本機(jī)綁定的蝌蹂,可能會(huì)造成不可移植的問題噩斟。
6: import: 導(dǎo)入依賴范圍,該依賴不會(huì)對(duì)三種classpath有任何實(shí)際的影響孤个。 一般用在dependency management中剃允,設(shè)定依賴的默認(rèn)版本。
依賴傳遞
在maven中齐鲤,依賴是具有傳遞性的斥废,例如項(xiàng)目依賴Spring-core, spring-core又依賴common-log,name項(xiàng)目就依賴common-log给郊。這些間接依賴的范圍又是如何定義呢牡肉?
這個(gè)我們需要分組進(jìn)行分析。
- 間接依賴為compile時(shí)淆九,則依賴關(guān)系與直接依賴相同
- 間接依賴為test時(shí)统锤,則無論直接依賴是什么都沒有依賴關(guān)系
- 間接依賴為provided時(shí), 直接依賴為provided時(shí)炭庙,依賴關(guān)系為provided饲窿; 直接依賴為其他時(shí),則沒有依賴依賴
- 間接依賴為runtime時(shí)焕蹄, 直接依賴為compile時(shí)逾雄,依賴關(guān)系為runtime
直接依賴關(guān)系為test時(shí), 依賴關(guān)系為test
直接依賴關(guān)系為provided時(shí)腻脏, 依賴關(guān)系為provided
直接依賴關(guān)系為runtime時(shí)鸦泳,依賴關(guān)系為runtime
依賴調(diào)解
在大多數(shù)情況下我們只需要關(guān)心項(xiàng)目的第一級(jí)依賴,可是有時(shí)候間接依賴可能會(huì)導(dǎo)致意想不到的沖突迹卢,這時(shí)候我們就需要對(duì)maven的選取機(jī)制有一定的了解辽故。maven選取機(jī)制有兩大原則。
- 路徑最短原則: 傳遞依賴的層級(jí)越少腐碱,則優(yōu)先選用誊垢。
項(xiàng)目A ->D->E->C(2.0)
項(xiàng)目A -> B ->C(1.0)
則項(xiàng)目A依賴C(1.0),因?yàn)镃(1.0)的路徑為2症见。 - 第一聲明者優(yōu)先原則: 當(dāng)依賴層級(jí)相同時(shí)喂走,則查看依賴的順序,順序優(yōu)先者優(yōu)先選用谋作。
項(xiàng)目A ->D->C(2.0)
項(xiàng)目A -> B ->C(1.0)
則項(xiàng)目A依賴C(2.0)芋肠,因?yàn)镃(2.0)與C(1.0)的路徑都為2,可是C(2.0)在C(1.0)之前被依賴遵蚜。
可選依賴
當(dāng)依賴屬性optional為true則為可選依賴帖池,當(dāng)依賴為可選依賴時(shí)奈惑,依賴不具有傳遞性。