maven的常见问题_Maven常见问题和陷阱
maven的常見問題
喜歡它還是討厭它(很多人似乎都討厭它), Maven是64%的Java開發人員廣泛使用的工具(來源– 2014年Java工具和技術前景 )。
大多數經驗豐富的開發人員已經對Maven感到頭疼。 通常以困難的方式,用頭撞到磚墻上。 不幸的是,我感到新的開發人員正在經歷同樣的艱苦學習過程。
縱觀世界各地的主要Java會議,您都找不到任何與Maven相關的會議,這些會議都可以指導您了解基礎知識。 也許社區認為您應該已經了解它們,就像Java語言本身一樣。 盡管如此,回收這些知識可能對每個人都是雙贏的情況。 您或您的隊友浪費了多少時間不知道如何處理Maven的特殊性?
如果您正在閱讀本文,我還將假設您掌握了Maven的基礎知識。 如果沒有,請查看以下文章:
- 5分鐘內完成Maven
- 構建生命周期簡介
還有很多其他文章。 我發現添加自己的內容,重復相同的內容沒有任何價值,但是如果我有需要,我可以寫一個。 讓我知道您是否支持!
無論如何,我認為我可以通過指出團隊在使用Maven時遇到的主要問題,對其進行解釋以及如何解決這些問題來增加一些價值。
為什么這個罐子在我的建筑物中?
由于采用了Maven傳遞依賴機制,因此所包含庫的圖可以很快變得很大。
如果您在類路徑中看到某些內容,但沒有將其放在此處,則很可能是由于傳遞依賴。 您可能需要它,也許不需要。 也許您正在使用的庫代碼的一部分不需要所有這些額外的jar。 在這里感覺像是一場賭博,但是如果使用mvn dependency:analyze ,您可能會有一個大概的想法。 該命令將告訴您項目實際使用了哪些依賴項。
我主要在這里進行反復試驗,排除我認為不需要的內容,然后運行代碼以查看一切是否正常。 不幸的是,該命令并沒有告訴您所使用的依賴項是否確實需要傳遞依賴項。 嘿,如果有人知道更好的方法,請告訴我!
我看不到我的變化!
可能由于多種原因而發生。 讓我們看一下最常見的:
依賴關系未在本地存儲庫中構建
您可能具有模塊A和模塊B。模塊B對模塊A具有依賴性。對模塊B所做的更改在模塊A中不可見。
發生這種情況是因為Maven調查了它自己的本地jar存儲庫,以將其包含在classpath中。 如果進行任何更改,則需要將新jar的副本放入本地存儲庫。 您可以通過在更改后的項目中運行mvn install來實現。
依賴版本不正確
可以很簡單地更改您正在使用的依賴項的版本,或者弄清楚該依賴項確實很麻煩。 當Maven執行依賴關系查找時,它將使用規則“最近定義優先”。 這意味著在依賴關系樹中,所使用的版本將是最接近您項目的版本。 困惑? 我也是。讓我們嘗試一個例子。
您想在項目A使用依賴項Dv1 ,但您正在獲取Dv2 ,并且具有以下依賴項樹:
A -> B -> C -> Dv1
A -> E -> Dv2
包括D哪個依存關系? Dv1還是Dv2 ? 在Dv2情況下,由于“最近定義優先”規則。 如果兩個依賴關系版本在依賴關系樹中的深度相同,則最重要的是聲明中的順序。
要解決此問題,您可以在A向Dv1顯式添加一個依賴Dv1 ,以強制使用Dv1或僅排除Dv2 。
如果使用命令mvn dependency:tree ,它將輸出一棵樹,其中將包含項目的所有依賴關系和版本。 這對于調試此類問題非常有幫助。
遠程存儲庫已覆蓋您的更改
公司通常會擁有一個內部Maven存儲庫,以緩存工件,存儲版本或提供您正在處理的項目的最新更改。 在大多數情況下,這很有效,但是當您使用SNAPSHOT版本時, Maven始終會嘗試獲取對該依賴項的最新更改。
現在,您很高興地在對Project B更改,該更改依賴于Project A 您在本地構建所有內容,然后繼續將更改集成到Project A 。 某人或某物,上傳新的SNAPSHOT版本的Project B 請記住,您所做的更改尚不可見,因為您已將所有內容都保存在本地并且尚未提交到VCS。 您對Project A進行的下一個構建將從公司存儲庫中選擇Project B ,而不是從本地存儲庫中選擇Project B
該罐子不包括在分發中!
為了增加一點混亂,讓我們談談范圍。 Maven有四個作用域: compile , provided , runtime和test 。 每個依賴項都有一個范圍,該范圍為您的應用程序定義了一個不同的類路徑。
如果缺少某些內容,并且假設您正確定義了依賴項,則問題很可能出在范圍之內。 使用compile范圍是安全的(默認)。 命令mvn dependency:analyze和mvn dependency:tree在這里也可以為您提供幫助。
找不到工件!
啊,可怕的是“無法解析依賴關系……找不到工件”。 這就像Java NPE! 發生這種情況的原因有很多。 還有其他一些明顯的東西,但是無論如何都要調試。 我通常會按照以下清單嘗試解決此問題:
- 檢查依賴項是否正確定義
- 檢查您是否指向存儲依賴項的正確遠程存儲庫
- 檢查遠程存儲庫是否真正擁有依賴項!
- 檢查是否有最新的pom.xml文件
- 檢查罐子是否損壞
- 檢查公司存儲庫是否正在緩存Internet存儲庫,并且沒有發出獲取新庫的請求
- 檢查依賴項定義是否被某些內容覆蓋。 使用mvn help:effective-pom進行構建項目的實際Maven設置
- 不要使用-o
結論
Maven并不是一個完美的工具,但是如果您學習了一些技巧,它將幫助您并節省調試構建問題的時間。 還有其他方法可以解決其中一些問題,但是我所掌握的知識不足,無法就這些問題發表意見。
無論如何,大量的項目使用Maven作為構建工具,我相信開發人員應該了解他們的構建工具,以便能夠在日常工作中表現更好。 希望這篇文章對您有用。
隨時發布此處未涵蓋的任何其他問題。 不幸的是, Maven有時似乎充滿了驚喜。
最后一條建議:永遠不要信任IDE! 如果它可以在命令行上運行,那就是IDE的問題!
翻譯自: https://www.javacodegeeks.com/2014/09/maven-common-problems-and-pitfalls.html
maven的常見問題
總結
以上是生活随笔為你收集整理的maven的常见问题_Maven常见问题和陷阱的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPhone重要数据怎么备份手机数据如何
- 下一篇: 谷歌拟 2027 年放弃博通,自主研发