Maven版本號中隱藏的驚天大秘密


此文轉載於 :https://www.cnblogs.com/hafiz/p/8124741.html

一、背景

  現在主流的Java系的互聯網公司里,絕大多數公司都使用Maven作為依賴管理工具,一般我們對於依賴的版本號,常見兩種類型:一種以“-RELEASE”結尾,另一種以“-SNAPSHOT”結尾。你別看這一個小小差別,在這里面可是隱藏着巨大的秘密:我們在團隊協作開發的時候,如果依賴版本號的命名不是很規范的話,往往你會發現一種現象,那就是別人更新了一個依賴,已經提交到了私服上,但是你本地死活拉不下來,最后沒有辦法,你選擇了直接刪除本地倉庫中的該版本的依賴,然后就完美解決了。但你有沒有想一想為什么會出現這種情況?有沒有更高效的解決辦法?那么本文我們就聊這個。

二、原理以及解決辦法

  在企業的私服中,會存在snapshot快照倉庫和release發布倉庫,snapshot快照倉庫用於保存開發過程中的不穩定版本,release正式倉庫則是用來保存穩定的發行版本。

  maven會根據模塊的版本號(pom文件中的version)中是否帶有“-SNAPSHOT”(注意這里必須是全部大寫)來判斷是快照版本還是正式版本。如果是快照版本,那么在mvn deploy時會自動發布到私服的快照版本庫中;如果是正式發布版本,那么在mvn deploy時會自動發布到正式版本庫中。

  如果在一個項目中,我們依賴了模塊A的快照版,還依賴了模塊B的正式版本,那么在不更改依賴模塊版本號的情況下,我們在進行直接編譯打包該項目時:即使本地倉庫中已經存在對應版本的依賴模塊A,maven還是會自動從鏡像服務器上下載最新的依賴模塊A的快照版本。而依賴正式版本的模塊B,如果本地倉庫已經存在該版本的模塊B, maven則不會主動去鏡像服務器上下載。這也是為什么我們會在本地倉庫中快照版本的依賴的目錄下會看到帶有時間戳的jar包,比如下面:

我們知道了這些以后,該怎么解決這個問題呢?

1.暴利解決(不優雅,所以不推薦)

  直接在本地maven的配置文件中的私服配置添加如下紅框內的配置

<profile>
    <id>nexus</id>
    <repositories>
        <repository>
            <id>nexus</id>
            <name>Nexus</name>
            <url>http://localhost:8087/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
                <updatePolicy>always</updatePolicy>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>always</updatePolicy>
            </snapshots>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>nexus</id>
            <name>Nexus</name>
            <url>http://localhost:8087/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
                <updatePolicy>always</updatePolicy>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>always</updatePolicy>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
</profile>

2.在打包的時候加上“-U”參數,強制拉取所有依賴的最新代碼

  mvn clean install -U

3.語義化版本

  首先,我們在團隊協作時,要定義好開發中的依賴一定不要忘記升級版本號,然后開發的過程中還要保持版本號以“-SNAPSHOT”結尾。來把該依賴作為快照版本進行開發,這樣每次別人更新完上傳到私服以后,你本地打包時會自動拉取最新代碼,從而方便我們的開發和維護。

三、總結

  通過本文,我們就明白了為什么快照版本的依賴,maven編譯打包的時候無論本地是否存在,都會去私服拉取最新的,而正式版本的依賴,如果本地倉庫已經存在,maven不會去私服拉取最新的原因,所以我們要基於快照版本進行開發,但是上線的時候一定記得變成正式版,否則如果本地正在進行開發另一個功能,提交到私服的代碼有可能會被誤上線。至此我們完美的解決了我們文章開頭拋出的問題,並且不是暴利解決。我遇見問題,就喜歡打破砂鍋弄到底,用最優雅的方式解決最復雜的問題。關於Maven,我想說的是:入門很簡單,但精通有難度!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM