最近一段時(shí)間僵闯,項(xiàng)目要做一些升級(jí)居触,首先weblogic要從11g升到12c,除了安裝新的weblogic之外少漆,還要更新jdk的版本尸疆,從1.6更新到1.8椿猎。然后是依賴(lài)framework的版本,因?yàn)橹耙恢睕](méi)有更新寿弱,所以要從9.x.x升到12.x.x犯眠。將toplink換成eclipselink。最后maven的依賴(lài)倉(cāng)庫(kù)也有變化症革,從上海的artifactory到hk的筐咧。下面就是我做這些改動(dòng)遇到的問(wèn)題
1.沒(méi)有清空本地倉(cāng)庫(kù)
在更新完一些基本配置后重新import依賴(lài)發(fā)現(xiàn)新的倉(cāng)庫(kù)缺失的jar并不多,然而這只是一個(gè)假象噪矛。在本地的repository中還有從原來(lái)artifactory下載下來(lái)的jar包量蕊,而maven在本地package的時(shí)候先找本地倉(cāng)庫(kù),所以即使遠(yuǎn)程倉(cāng)庫(kù)仲有很多jar沒(méi)有艇挨,在本地還是可以通過(guò)的残炮。所以在更換遠(yuǎn)程倉(cāng)庫(kù)的時(shí)候一定要注意,先清空本地的repository缩滨。另外還有一點(diǎn)就是setting.xml的設(shè)置吉殃,遠(yuǎn)程倉(cāng)庫(kù)的地址就是在這里更新辞居,值得注意的是要將其他的repository設(shè)置成enable為FALSE。
2.導(dǎo)入本地依賴(lài)
因?yàn)閾Q了新的artifactory蛋勺,所以很多依賴(lài)在新的倉(cāng)庫(kù)中都沒(méi)有。并且還有就是要上傳新的jar到新的倉(cāng)庫(kù)需要提供很多信息鸠删,并且要經(jīng)過(guò)審核(起碼兩天)才能用抱完,而經(jīng)過(guò)排查,項(xiàng)目有幾十個(gè)jar是新的倉(cāng)庫(kù)沒(méi)有的刃泡,所以這是一個(gè)大工程巧娱。另外還有一點(diǎn)就是要去看每個(gè)依賴(lài)的licence,當(dāng)然這是必須的烘贴,但是這也是短時(shí)無(wú)法解決的事情禁添。所以我決定先把需要的jar放在項(xiàng)目中,引用項(xiàng)目中的依賴(lài)先在測(cè)試環(huán)境上測(cè)試桨踪,再進(jìn)行之后的工作老翘。
醉出我的想法是兩步走。第一步將jar包放在本地的lib文件夾中锻离,然后在pom中將相關(guān)的dependency設(shè)置成本地引用:
……
<scope>system</scope>
<systempath>……</systempath>
這里的system就是標(biāo)明我要使用本地依賴(lài)铺峭。
因?yàn)檫@種方式在使用maven-dependency-plugin的copy-dependency的時(shí)候是不會(huì)拷貝的,所以我試圖使用相同插件的copy的goal將本地依賴(lài)copy到要打包的jar文件夾下汽纠。
然而第二步這種方法并不奏效卫键,因?yàn)樵赾opy的時(shí)候,它并不知道我要copy的是本地的jar虱朵,所以第一時(shí)間是去repository中去找莉炉,但是它并找不到這個(gè)jar,所以無(wú)法完成copy碴犬。
于是我又想了另一個(gè)辦法絮宁,因?yàn)橹暗捻?xiàng)目是通過(guò)編寫(xiě)ant腳本來(lái)實(shí)現(xiàn)很多文件搬運(yùn)的工作的,而maven本身有maven-antrun-plugin插件翅敌,可以使用他的簡(jiǎn)單配置完成文件的搬運(yùn)工作羞福。
好像還有另外一種方式可以實(shí)現(xiàn)依賴(lài)本地的jar,需要配置一個(gè)本地的repository蚯涮,在配置的目錄下放置要依賴(lài)的jar包治专。但是值得注意的是,這里面要嚴(yán)格按照groupid/artifactid/version/….jar的目錄來(lái)存放文件遭顶。
當(dāng)然在這個(gè)部分我還犯了另一個(gè)錯(cuò)誤张峰,因?yàn)檫@種方式本地的jar是要push到項(xiàng)目的repository上面的,但是之前的項(xiàng)目并不需要棒旗,所以之前的gitignore中將jar類(lèi)型文件忽略了喘批,導(dǎo)致jar并沒(méi)有上傳上去撩荣。所以在build jenkins的時(shí)候報(bào)出在特定目錄下找不到依賴(lài)jar的錯(cuò)誤。
3.解決依賴(lài)沖突
更新后的項(xiàng)目依賴(lài)可能來(lái)自新的遠(yuǎn)程倉(cāng)庫(kù)饶深,因?yàn)閭}(cāng)庫(kù)是新的餐曹,有的版本的依賴(lài)沒(méi)有,所以也會(huì)更新一些版本信息敌厘,然后沒(méi)有的依賴(lài)要用本地的jar台猴,資源來(lái)自不同地方,版本也有更新俱两,所以就可能有依賴(lài)的沖突饱狂。
最開(kāi)始我采取的方式是和過(guò)于已經(jīng)能夠成功deploy的ear 用beyoundcompare進(jìn)行比較,一個(gè)是觀察有沒(méi)有缺失的jar宪彩,然后就是看有沒(méi)有多出來(lái)的重復(fù)的不同版本的jar休讳。一旦發(fā)現(xiàn)存在重復(fù)的jar,用maven的dependency:tree命令觀察重復(fù)的依賴(lài)是如何產(chǎn)生的尿孔,之后將它exclude掉俊柔。但是當(dāng)我做完這個(gè)工作之后,發(fā)現(xiàn)deploy的時(shí)候還是存在依賴(lài)沖突纳猫,所以發(fā)現(xiàn)這個(gè)做法很笨且無(wú)效婆咸,應(yīng)該存在某種maven命令能夠直接檢測(cè)依賴(lài)沖突,果然這種命令式存在的芜辕,如下:
mvn -X compile dependency:tree -Dverbose >a.log
這樣可以直接生成依賴(lài)樹(shù)尚骄,并且會(huì)標(biāo)記依賴(lài)沖突,通過(guò)search “omitted for conflict with”可以看到?jīng)_突的jar侵续,然后將他們exclude就可以了倔丈。
還遇到一種情況很奇怪,就是exclude了沖突的jar之后發(fā)現(xiàn)編譯不過(guò)了状蜗,明明依賴(lài)了更新版本的jar需五,于是我在打包的時(shí)候?qū)⑺苯觘xclude掉了,在deploy的時(shí)候也沒(méi)有出現(xiàn)問(wèn)題轧坎。
雖然花了很長(zhǎng)時(shí)間才成功jenkins build成功宏邮,但是還是收獲了很多知識(shí)和處理問(wèn)題的思路。以后再遇到類(lèi)似的情況就能更好的應(yīng)對(duì)了缸血。