mysql maven 依赖关系_Maven依赖总结
一:依賴范圍
Maven在編譯項(xiàng)目主代碼的時(shí)候需要使用一套classpath。其次,在編譯和執(zhí)行測試的時(shí)候會(huì)使用另外一套classpath。最后,實(shí)際運(yùn)行Maven項(xiàng)目的時(shí)候,又會(huì)使用一套classpath。
所謂的依賴范圍就是用來控制依賴與這三種classpath(編譯、測試、運(yùn)行)的關(guān)系,Maven有以下幾種依賴范圍:
compile:編譯依賴范圍。如果沒有指定,默認(rèn)使用該依賴范圍。使用此依賴范圍時(shí),對(duì)于編譯、測試、運(yùn)行都有效。例如:spring-core,編譯、測試、運(yùn)行時(shí)都需要使用該依賴。
test:測試依賴范圍。只對(duì)測試classpath有效。例如:JUnit,它只在編譯測試代碼以及運(yùn)行測試的時(shí)候才需要,編譯和運(yùn)行classpath時(shí)無法使用此依賴。
provided:已提供依賴范圍。對(duì)于編譯和測試時(shí)有效,但在運(yùn)行時(shí)無效。例如:servlet-api,編譯和測試項(xiàng)目的時(shí)候需要該依賴,但運(yùn)行時(shí),由于容器已經(jīng)提供,就不需要Maven重復(fù)的引入。
runtime:運(yùn)行時(shí)依賴。編譯時(shí)無效,對(duì)于測試和運(yùn)行有效。例如:JDBC驅(qū)動(dòng)實(shí)現(xiàn),編譯時(shí)只需要JDK提供的JDBC接口,只有在執(zhí)行測試和運(yùn)行時(shí)才需要實(shí)現(xiàn)上述接口的具體JDBC驅(qū)動(dòng)。
system:系統(tǒng)依賴范圍。同provided。使用該依賴時(shí)必須通過systemPath元素顯式地指定依賴文件路徑。主要用于依賴本地的、且Maven倉庫之外的類庫文件。例如:
javax.sql
jdbc-stdext
2.5
system
${spath}/lib/test.jar
二:傳遞依賴和依賴范圍
當(dāng)我們依賴一個(gè)a.jar時(shí),如果a.jar依賴b.jar,那么只需要早pom中聲明對(duì)a.jar的依賴即可,b.jar會(huì)被Maven自動(dòng)加載進(jìn)來。
例如:有一個(gè)org.springframework:spring-core:2.5.6的依賴,而實(shí)際上spring-core也有它自己的依賴,它依賴commons-logging。有了傳遞依賴機(jī)制,在使用spring-core時(shí)不需要考慮它依賴了什么。Maven會(huì)自動(dòng)解析。
依賴范圍在傳遞依賴時(shí)會(huì)略有變化
當(dāng)?shù)诙苯右蕾嚨姆秶莄ompile的時(shí)候,傳遞性依賴的范圍與第一直接依賴的范圍一致;
當(dāng)?shù)诙苯右蕾嚨姆秶莟est的時(shí)候,依賴不會(huì)得以傳遞;
當(dāng)?shù)诙苯右蕾嚨姆秶莗rovided的時(shí)候,只傳遞第一直接依賴范圍也為provi的依賴,且范圍為provided;
當(dāng)?shù)诙苯右蕾嚨姆秶莚untime的時(shí)候,傳遞性的依賴范圍與第一直接依賴的范圍一致,但compile例外,此時(shí)傳遞依賴范圍為runtime;
三:依賴調(diào)解
原則一:路徑最近者優(yōu)先。例如:A ->B?->C?->X(1.0) 同時(shí) A?->D?->X(2.0),很顯然X(2.0)路徑更短,會(huì)被解析使用。
原則二:第一聲明者優(yōu)先。在依賴長度相等情況下,解析在pom中依賴聲明中順序考前的。例如:A ->B?->X(1.0) 同時(shí) A?->D?->X(2.0)。如果B在D之前聲明,那么X(1.0)會(huì)被解析。
除以上兩種原則外,還可以手動(dòng)排除,例如:A ->B?->X(1.0)同時(shí)A ->X(2.0)。如果項(xiàng)目A希望加載X(2.0)可做如下聲明,通過元素來顯式排除。
com.xxx.xx
xx-B
2.5
com.xx
project-X
com.xxx.xx
project-x
2.0
四:可選依賴
例如:b.jar是一個(gè)持久層工具包,它同時(shí)支持Mysql和PostgreSql,A項(xiàng)目依賴b.jar,那么在構(gòu)建A時(shí)需要這兩種數(shù)據(jù)庫的驅(qū)動(dòng)程序,但在使用的時(shí)候知會(huì)依賴一種數(shù)據(jù)庫。A項(xiàng)目的依賴聲明如下:
com.xxx.xx
xx.db
2.5
mysql
mysql-connector-java
5.1.10
true
postgresql
postgresql
8.4-701.jdbc3
true
使用元素表示這兩個(gè)為可選依賴,這是依賴不會(huì)傳遞到A項(xiàng)目,當(dāng)A項(xiàng)目需要使用基于MySQL數(shù)據(jù)庫時(shí),需要顯式聲明對(duì)mysql的依賴。
另外:在理想的情況下是不會(huì)出現(xiàn)這種情況的,因?yàn)樵诿嫦驅(qū)ο笤O(shè)計(jì)中,有一個(gè)單一職責(zé)原則,即一個(gè)jar的職責(zé)應(yīng)該只有一個(gè)。所以對(duì)于b.jar,最好是創(chuàng)建2個(gè)Maven項(xiàng)目,分別實(shí)現(xiàn)mysql和postgresql。
五:依賴優(yōu)化
代碼需要不斷重構(gòu)才能達(dá)到最優(yōu),依賴管理也是一樣,需要不斷的進(jìn)行去除多余依賴,以及顯式的聲明某些必要的依賴。
Maven會(huì)自動(dòng)解析所有項(xiàng)目的直接依賴和傳遞依賴,并根據(jù)規(guī)則判斷每個(gè)依賴的范圍,對(duì)于一些依賴沖突也能進(jìn)行調(diào)節(jié),這些工作之后得到這個(gè)項(xiàng)目的完整的已解析依賴。
可通過運(yùn)行以下命令查看當(dāng)前項(xiàng)目的已解析依賴:
mvn dependency:list
上圖展示了當(dāng)前項(xiàng)目中所有已解析的依賴,同時(shí)每個(gè)依賴的范圍也得以明確標(biāo)示。
如果將直接在pom中聲明的依賴定義為第一層依賴,這些頂層依賴的依賴定義為第二層依賴,則以此類推可以形成一個(gè)完整的依賴樹。
可運(yùn)行以下明細(xì)查看當(dāng)前項(xiàng)目的依賴樹
mvn dependency:tree
從上圖中可以清晰看出,雖然沒有聲明slf4j-api,但它通過傳遞依賴被加載進(jìn)來,其范圍為compile。
可運(yùn)行以下命令對(duì)當(dāng)前項(xiàng)目依賴進(jìn)行簡單分析
上圖中Used undeclared dependencies,表示項(xiàng)目中使用到的,但是沒有顯式聲明的依賴。可以看到第一個(gè)依賴是SNAPSHOT版本,它是通過傳遞依賴被加載進(jìn)來的,這種依賴就是項(xiàng)目中的隱藏的、潛在的炸彈,因?yàn)橐玫氖荢NAPSHOT非穩(wěn)定版本,且不在pom中顯式聲明,很容易被忽略。該炸彈一旦爆炸,往往需要耗費(fèi)大量時(shí)間來查明。
還有一個(gè)Unused declared dependencies,表示項(xiàng)目中未使用的,但是顯式聲明的依賴。如果真的不需要,建議去除聲明。但需要注意的是,dependency:analyze知會(huì)分析編譯和測試時(shí)需要用到的依賴,一些運(yùn)行時(shí)依賴就無法被發(fā)現(xiàn)。所以在優(yōu)化依賴時(shí)一定要小心測試。
總結(jié)
以上是生活随笔為你收集整理的mysql maven 依赖关系_Maven依赖总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LATEX 排版问题记录
- 下一篇: 图书管理系统 jsp + servlet