1. 程式人生 > >MVN明明添加了依賴確還是報找不到

MVN明明添加了依賴確還是報找不到

昨天做spark和flume對接的時候,特麼的一直報找不到啥log4j,slf4j-NOP bind啥的或者版本不相容啥的,一查說少依賴了,於是到mvnrepository去找到了,添加了上去,結果還是一直報找不到啊,載入失敗啊

最後才發現原來特麼的是因為這scope(範圍)自帶的引數不對,test這東西預設是不載入到執行專案裡的,吐血

Maven的一個哲學是慣例優於配置(Convention Over Configuration), Maven預設的依賴配置項中,scope的預設值是compile,專案中經常傻傻的分不清,直接默認了。今天梳理一下maven的scope。

scope的分類和作用

(1)compile
預設就是compile,什麼都不配置也就是意味著compile。compile表示被依賴專案需要參與當前專案的編譯,當然後續的測試,執行週期也參與其中,是一個比較強的依賴。打包的時候通常需要包含進去。

(2)test
scope為test表示依賴專案僅僅參與測試相關的工作,包括測試程式碼的編譯,執行,這個東西他是不載入到你的編譯專案下面的!!所以有這個test,就有可能出現明明加了依賴,卻還是報錯。

(3)runntime
runntime表示被依賴專案無需參與專案的編譯,不過後期的測試和執行週期需要其參與。與compile相比,跳過編譯而已,說實話在終端的專案(非開源,企業內部系統)中,和compile區別不是很大。比較常見的如JSR×××的實現,對應的API jar是compile的,具體實現是runtime的,compile只需要知道介面就足夠了。oracle jdbc驅動架包就是一個很好的例子,一般scope為runntime。另外runntime的依賴通常和optional搭配使用,optional為true。我可以用A實現,也可以用B實現。

(4)provided
provided意味著打包的時候可以不用包進去,別的設施(Web Container)會提供。事實上該依賴理論上可以參與編譯,測試,執行等週期。相當於compile,但是在打包階段做了exclude(排除)的動作,我們在spark提交作業的時候,外部依賴如何解決?其實大部分大資料生態圈的依賴在叢集上都是有的,所以剩下的就外部以來就用provide過濾掉有的,再打包,單獨jars上去。

(5)system
從參與度來說,也provided相同,不過被依賴項不會從maven倉庫抓,而是從本地檔案系統拿,一定需要配合systemPath屬性使用。

本文部分轉自博主

https://blog.csdn.net/kimylrong/article/details/50353161