慕工程0101907
2021-08-25 10:20:13
我繼承了一個帶有數十個“提供”范圍依賴項的 Maven 項目。我正在插入一個新的依賴項,該依賴項本身依賴于前面提到的“提供”依賴項之一。這個新依賴的范圍是“compile”/default 標簽。該應用程序無需添加新的依賴項即可運行。使用新依賴項成功編譯應用程序后,應用程序在運行時失敗,因為新依賴項找不到“提供的”依賴項。是否有必要讓所有“提供的”依賴項與“提供的”依賴項一起使用(并且與任何其他范圍相同——它們只適用于它們的種類)?我想不出任何其他解釋為什么新的默認/“編譯”依賴項不能與現有的“提供”依賴項一起使用。正如我所提到的,在引入任何新依賴項之前,它們已經明確提供并起作用。
1 回答

慕蓋茨4494581
TA貢獻1850條經驗 獲得超11個贊
問題不在于您的編譯依賴項依賴于提供的依賴項,而是提供的依賴項在運行時不存在。我只能猜測為什么會這樣,但一個可能的解釋是它已經丟失了,只是之前沒有人在運行時實際使用過該依賴項,所以這無關緊要。
本質上,通過建立依賴關系:
compile,你是說“我需要這個來編譯我的代碼,我在運行時也需要它”
提供,你說“我需要這個來編譯我的代碼,但在運行時其他人會提供它”
運行時,你說“我不需要它來編譯我的代碼,但在運行時需要它”
compile是默認和最常見的作用域,因為大多數依賴項在編譯時和運行時都需要,所以告訴 Maven 在這兩種情況下傳播它們是有意義的。
提供的是其他人將在運行時提供庫的情況(例如,servlet 容器通常將servlet-api.jar
作為基礎結構的一部分提供)。然而,當您需要針對某個庫進行編譯時,此范圍有時也(ab)用于奇怪的情況,但實際上將/可能不會在運行時使用它(例如可選功能)。對于您的情況,同樣重要的是,如果依賴項實際上并未在運行時提供并且嘗試在運行時使用它,則應用程序只會在提供的依賴項上失敗。
當有 API 工件和實現工件時,運行時是非常常見的范圍,例如slf4j-api
和slf4j-log4j
- 然后您只需要在編譯時使用 API,但在運行時需要 API 和實際實現。
添加回答
舉報
0/150
提交
取消