關於svn和maven結合使用的討論


 目前項目組在開發一個項目,由多個子模塊構成,構建工具是maven,版本控制工具是svn。本文想對如何結合使用maven和svn提出一點初步的想法 


一、只有svn的情況 

       首先考慮沒有maven的情況。這樣的話,項目組每個開發人員,都需要在本地check out所有的源碼

每次提交之前,需要先更新周邊工程的代碼。由於工程之間是依賴的,所以很可能需要把所有的代碼都更新一遍。在項目依賴混亂的情況下,就更麻煩 ,等於說,項目組成員之間的協作,是以SVN為中心的 


      這種做法的缺點在於: 

    1、開發人員本地需要有所有的代碼,編譯速度很慢 

    2、如果是別人負責的模塊出錯,會影響自己的開發。如果項目比較大的話,別人負責的模塊的問題,自己實際上是解決不了的

這種做法的優點在於: 

    1、提交之前做一次全量更新,相當於在本地做了一次全量編譯,提交到SVN上基本可以保證不會出現編譯錯誤。我稱之為“悲觀提交”,類似於數據庫里“悲觀鎖” 

    2、由於本地有所有代碼,所以本地構建比較不容易出錯 

二、引入maven的情況 

        maven的主要作用之一,就是對模塊化開發的支持 
  
        開發人員A機器上可以只有工程A,開發人員B機器上只有工程B,其中工程B依賴工程A 

        只要工程A已經deploy到了遠程倉庫(私服),那么工程B就可以在本地構建,不需要有工程A的代碼。也就是說,每個開發人員本地,都只需要check out自己負責的工程


這種做法的優點在於: 

    1、每個人只有自己負責的代碼,本地構建的速度快 

    2、如果其他的模塊構建出錯,對自己的模塊不容易造成影響 

    3、職責划分清晰 

這種做法的缺點是: 

    1、高層模塊的構建,依賴於低層的模塊。由於開發人員B本地只有工程B的代碼,如果工程A還沒有deploy到遠程倉庫,則工程B就無法進行本地構建 

    2、提交到SVN后,有可能造成SVN上的全量編譯失敗。比如A刪除了一個方法,並提交到svn,但是沒有deploy。那么B就會基於A模塊舊的構件來進行本地構建,成功后也提交了代碼。這樣的話,在svn上編譯就無法通過

要避免發生以上的問題,我覺得在項目組內要遵循2個規定: 

    1、提交了代碼,需要同時將模塊deploy進遠程倉庫。以免造成遠程倉庫的構件與svn源代碼的不一致 

    2、需要在pom里將構件更新的策略設置為always Xml代碼  
            <snapshots>  
                <enabled>true</enabled>  
                <updatePolicy>always</updatePolicy>  
            </snapshots>  

        以上2個規定,第一個是解決提交不一致的問題,第二個是解決獲取不一致的問題。目的都是為了避免構建成功,但是svn上全量編譯失敗的問題 

由於是先提交,再發現是否SVN編譯失敗,所以我稱之為“樂觀提交” 


三、比較 

        總的來說,上述兩種方式的區別,關鍵在於:一種是本地有所有的代碼;另一種是本地只有自己負責的代碼 

       對於小項目來說,不存在這個問題。但是如果是比較大的項目,我認為后者是更優的,但是會引入一些額外的問題,需要項目組所有人遵循規范來避免 


四、引入CI 


      結合使用svn和maven,如果引入CI的話,可以讓這個過程更加容易 

      開發人員在本地構建成功之后,把代碼提交到svn,由CI系統(比如hudson),來完成deploy的動作 

      或者,使用SCM插件,綁定到deploy階段。在deploy成功之后,由插件完成提交svn的動作。這樣也可以保證提交svn和deploy的一致性 

      如果提交之后,在svn上全量編譯失敗,那么CI系統也會第一時間通知相關人員 

五、總結 


      總的來說,我認為有以下幾點: 

1、建議采用分模塊開發的方式,每個開發人員僅check out自己負責的代碼 

2、將snapshots更新策略設置為always   解決獲取不一致

3、用ci系統或者scm插件,保證check in和deploy的一致性 

4、依賴ci系統,來及時發現svn上的編譯錯誤


免責聲明!

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



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