問題解決:嘗試解決maven依賴找不到的n種姿勢

yscoder發表於2020-12-05

 

問題場景

公司的原倉庫出了問題,需要更換新的倉庫。故給了一個新的倉庫地址。但是奇葩的是,更換之後,就出問題了。比如原本有A-0.0.1-SNAPSHOT.jar,在私服上面也有這個版本的jar包,但是就是沒辦法找到,一直提示該jar的該版本找不到。

問題環境

軟體版本
maven3.2.3
IntelliJ IDEA2019.1

問題原因

接下來就是探索發現之旅了。

  1. 因為是更新了setting檔案,所以懷疑是沒有選對檔案。在 ideasetting上面搜尋maven,檢視相關的選項,看到是選對了settings.xml。這個嘗試失敗;
  2. 因為是使用idea,所以懷疑是不是工具沒有更新依賴,於是我將整個專案的 maven依賴重新匯入,即reimport。很遺憾,沒有解決問題;
    在這裡插入圖片描述
  3. 因為之前有遇到一個奇葩的問題,怎麼reimport都失敗,而使用ideamaven外掛的compile命令,反而觸發了依賴下載。所以,我點選了compile,很遺憾,也不行;
    在這裡插入圖片描述
  4. 懷疑是idea關於maven的配置有問題,比如在maven的編輯頁面,不小心或者其他因素導致Work offline被勾選上了,那就導致依賴只會從本地找,而不是從私服找。開啟一看,我的配置很正常。哎,這一步也嘗試失敗。
    在這裡插入圖片描述
  5. 這個時候,有點懷疑是不是遠端倉庫是不是沒有這個jar包,所以登入公司的私服,到對應的地址找。誒,這個版本下面怎麼有這麼多以時間戳命名的包,難道我還得以特定的時間戳版本下載嗎?這個不科學,要知道這個版本是開發版本,是會隨時更新的。所以這是什麼回事呢???

到這裡,我們就說到正題了,這個就涉及maven的高階配置了。在實際開發過程中,我們經常會遇到版本依賴的場景。比如服務A依賴服務B,而服務B處於開發階段。假如服務B的當前版本是1.0,而服務A指定依賴了服務B的版本1.0。過了一段時間,服務B發現了bug,並進行修復了,所以升級為2.0。這樣,服務A就得同時將服務B的版本升級為2.0,不然就可能出現問題。如果一直持續下去,我相信開發人員都會想吐血的。所以,這個時候就得引入mavenSnapshot版本機制。在開發過程中,服務B指定了對應的Snapshot版本,比如0.0.1-Snapshot,而服務A進行依賴B的時候就指定其Snapshot版本。服務B每次迭代更新的時候,釋出到私服倉庫的時候,都會形成帶有時間戳命名的Snapshot版本,而服務A在構建的時候,都會下載服務B帶有最新時間戳Snapshot版本。這樣,問題就得到了完美解決。比如下圖就是服務B帶有時間戳Snapshot版本截圖。
在這裡插入圖片描述

解決方案

在專案的pom.xml檔案,裡面加上這些配置:

<repositories>
        <repository>
            <id>maven-releases</id>
            <name>maven-releases</name>
            <url>http://test.com:2000/repository/maven/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
  •  

結果

專案依賴順利下載下來了,專案編譯也沒有問題了。看到專案pom.xml檔案沒有標紅的時候,十分開心 ٩(๑❛ᴗ❛๑)۶

總結

開發過程中,總是會遇到各種問題。即使解決了,也得找到問題解決的原因。知其然才能有技術沉澱,當然也得記錄下來。不然下次遇到相同的問題,也會忘記的 (๑╹◡╹)ノ"""

參考連結

Maven: working with multiple repositories

Maven Settings

Maven: introduction to repositories

相關文章