亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Maven 依賴問題:提供和編譯依賴一起工作

Maven 依賴問題:提供和編譯依賴一起工作

慕工程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-apislf4j-log4j- 然后您只需要在編譯時使用 API,但在運行時需要 API 和實際實現。


查看完整回答
反對 回復 2021-08-25
  • 1 回答
  • 0 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號