小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

maven增量編譯

 liang1234_ 2019-06-24

 最近由于不清楚maven(2.2.x)增量編譯的機(jī)制,導(dǎo)致應(yīng)用出現(xiàn)了一個(gè)當(dāng)時(shí)覺得非常詭異的一個(gè)問題。先描述一下問題。

    背景是應(yīng)用A有一個(gè)公用的base包,版本為1.6.6-SNAPSHOT,應(yīng)用B依賴于這個(gè)公用的base包。我在base包中修改了一個(gè)字符串變量的值,該變量是一個(gè)緩存的key(如下面代碼的Constants類,中的CACHE_KEY)。然后使用mvn deploy 命令把base包上傳到中心庫中。出現(xiàn)的問題是應(yīng)用B打包部署,應(yīng)用上線后,使用后臺(tái)功能刪除"cache.key.new"對(duì)應(yīng)的緩存值,提示刪除成功。但是前臺(tái)展示的還是老的值(前臺(tái)展示取的數(shù)據(jù)是從緩存取出的,簡化代碼后,參考下面的CategoryManager的showCategory()方法,根據(jù)key在緩存中取出值,然后前臺(tái)展示)。
 
  public Interface Constants{
        public interface Cache{
            String CACHE_KEY = “cache.key.new”;//舊值為"cache.key"
    }
}

 

復(fù)制代碼
public Class CategoryManager{
    private static Map<int, String> keyMaps = new HashMap<String, String>();
        static {
             keyMaps.put(1, Constants. Cache. CACHE_KEY);//把緩存的key存到map中
             .........
    }
 
        public Object showCategory(){
            return  cacheManager.get(keyMaps.get(1));//在緩存中獲取數(shù)據(jù)
        }
}
復(fù)制代碼
    一開始懷疑是包沒有成功deploy到中心庫中,然后在中心庫中把1.6.6-SNAPSHOT的源碼包拉了下來,發(fā)現(xiàn)里面的代碼是新的。
    我的印象中deploy是maven生命周期的最后一步,執(zhí)行deploy命令是會(huì)執(zhí)行compile編譯操作的,當(dāng)時(shí)懷疑自己記錯(cuò)了,以為base包deploy的時(shí)候沒有走到compile,就把包發(fā)到中心庫中了,后續(xù)把base包的1.6.6-SNAPSHOT的編譯后的文件拉下來,并且反編譯Constants類,發(fā)現(xiàn)CACHE_KEY的確是新的值"cache.key.new",證明這塊是被重新編譯過了。(后續(xù)翻閱了下資料”http://maven./guides/introduction/introduction-to-the-lifecycle.html maven生命周期“發(fā)現(xiàn)自己記的的確沒錯(cuò))
    最后把CategoryManager.class反編譯過來一看,發(fā)現(xiàn)里面的部分代碼是這樣的:
 
復(fù)制代碼
    public Class CategoryManager{
    private static Map<int, String> keyMaps = new HashMap<String, String>();
        static {
             keyMaps.put(1, "cache.key");//問題出在這里,這個(gè)"cache.key"沒有替換成新的值"cache.key.new"
             .........
    }
........
}
復(fù)制代碼

 

    發(fā)現(xiàn)問題了,這里的"cache.key"并沒有替換成新值。也就是說CategoryManager類并沒有重新編譯。這里的原因是maven的增量編譯機(jī)制。
    后續(xù)找了些資料表明,默認(rèn)情況下maven是增量編譯的,maven在編譯的時(shí)候會(huì)先去比較源文件(.java)文件的修改時(shí)間和對(duì)應(yīng)類文件(.class)的修改時(shí)間,如果源文件的修改時(shí)間比類文件的修改時(shí)間要晚的話,重新編譯原文件否則不做處理(另外,如果刪除了一個(gè)java文件,對(duì)應(yīng)的class文件在增量編譯時(shí)是不會(huì)被移除的)。
    在這里CategoryManager的源文件并沒有發(fā)生過改變,所以不會(huì)重新編譯。并且這個(gè)地方恰好是靜態(tài)代碼塊,這段代碼  keyMaps.put(1, Constants. Cache. CACHE_KEY); 編譯時(shí)直接被替換成 keyMaps.put(1, "cache.key"); ,如果是在非靜態(tài)代碼塊里面使用的話,這塊地方是不會(huì)出問題的。所以之前一直使用mvn deploy都沒有出現(xiàn)過問題。
    那要怎么避免這個(gè)問題呢,使用mvn clean deploy。clean會(huì)做一些清理的工作,包括移除上一次構(gòu)建的文件。這樣就能很好的解決這個(gè)問題了。
參考:
http://blog./teamcity/2012/03/incremental-building-with-maven-and-teamcity/ 部分有關(guān)于maven的 incremental building 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多