在現在的互聯網項目開發當中,特別是Java領域,能夠說Maven隨處可見。Maven的倉庫管理、依賴管理、繼承和聚合等特性爲項目的構建提供了一整套完善的解決方案,能夠說若是你搞不懂Maven,那麼一個多模塊的項目足以讓你頭疼,依賴衝突就會讓你不知所措,甚至搞不清楚項目是如何運行起來的,專題的目的就是:完全搞定Maven!html
<!-- localRepository | The path to the local repository maven will use to store artifacts. | | Default: ${user.home}/.m2/repository --> <localRepository>/path/to/local/repo</localRepository>
你要jar包,不可能每次都要聯網去下載吧,多費勁,因此本地倉庫就是至關於加了一層jar包緩存,先到這裏來查。若是這裏查不到,那麼就去私服上找,若是私服也找不到,那麼去中央倉庫去找,找到jar後,會把jar的信息同步到私服和本地倉庫中。mysql
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.12.6</version> </dependency>
通常而言,咱們能夠到私服上輸入artifactId進行搜索,或者到http://search.maven.org/、http://mvnrepository.com/上進行查找肯定座標。sql
在實際開發中,咱們常常遇到這樣的場景,好比A服務依賴於B服務,A和B同時開發,B在開發中發現了BUG,修改後,將版本由1.0升級爲2.0,那麼A必須也跟着在POM.XML中進行版本升級。過了幾天後,B又發現了問題,進行修改後升級版本發佈,而後通知A進行升級...能夠說這是開發過程當中的版本不穩定致使了這樣的問題。api
Maven,已經替咱們想好了解決方案,就是使用Snapshot版本,在開發過程當中B發佈的版本標誌爲Snapshot版本,A進行依賴的時候選擇Snapshot版本,那麼每次B發佈的時候,會在私服倉庫中,造成帶有時間戳的Snapshot版本,而A構建的時候會自動下載B最新時間戳的Snapshot版本!緩存
首先來講,對於Maven而言,同一個groupId同一個artifactId下,只能使用一個version!根據上圖的依賴順序,將使用1.2版本的jar。tomcat
如今,咱們能夠思考下了,好比工程中須要引入A、B,而A依賴1.0版本的C,B依賴2.0版本的C,那麼問題來了,C使用的版本將由引入A、B的順序而定?這顯然不靠譜!若是A的依賴寫在B的依賴後面,將意味着最後引入的是1.0版本的C,極可能在運行階段出現類(ClassNotFoundException)、方法(NoSuchMethodError)找不到的錯誤(由於B使用的是高版本的C)!服務器
使用<dependencyManagement> [這種主要用於子模塊的版本一致性中]mybatis
使用<exclusions> [在實際中咱們能夠在IDEA中直接利用插件幫助咱們生成]架構
使用<dependency>maven
在工程中,咱們避免不了須要加一些依賴,也許加了依賴後運行時才發現存在依賴衝突在去解決,彷佛有點晚!那麼能不能提早發現問題呢?
若是咱們新加入一個依賴的話,那麼先經過mvn dependency:tree命令造成依賴樹,看看咱們新加入的依賴,是否存在傳遞依賴,傳遞依賴中是否和依賴樹中的版本存在衝突,若是存在多個版本衝突,利用上文的方式進行解決!
這裏須要注意2點:
咱們只須要注意一點:執行後面的命令時,前面的命令自動獲得執行。
既然,Maven的生命週期存在編譯、測試、運行這些過程,那麼顯然有些依賴只用於測試,好比junit;有些依賴編譯用不到,只有運行的時候才能用到,好比mysql的驅動包在編譯期就用不到(編譯期用的是JDBC接口),而是在運行時用到的;還有些依賴,編譯期要用到,而運行期不須要提供,由於有些容器已經提供了,好比servlet-api在tomcat中已經提供了,咱們只須要的是編譯期提供而已。
原文出處:https://www.cnblogs.com/luao/p/10896403.html