過程說明
如果項目中使用了Spring Framework 的版本比較老(比如V3.1.1),而社區(qū)已經(jīng)對對應(yīng)的分支停止了維護(hù)狸涌,當(dāng)遇到了新發(fā)現(xiàn)的安全漏洞或缺陷時切省,會面臨面臨尷尬,雖然有官方的補(bǔ)丁版本但和自己的版本差別太大帕胆,不能直接靠升級解決朝捆,只能自己來維護(hù),而這一般都要被迫經(jīng)歷一個不熟悉的過程懒豹。
步驟
- 下載代碼
一般老版本的的發(fā)布時間太久了芙盘,直接在發(fā)布區(qū)要爬很長時間的樓才(或許)可能找到對應(yīng)版本。最直接的還是通過git 來獲取吧脸秽。
# 下載代碼
git clone https://github.com/spring-projects/spring-framework
cd spring-framework
老版本在Tag中可以找到儒老,為了方便代碼修改和變更跟蹤,基于tag建立一個開發(fā)分支
# 基于tag 建立開發(fā)分支
git branch v3.1.1.dev v3.1.1.RELEASE
git checkout v3.1.1.dev
- 下載jdk及ant鏡像
要核對該版本對應(yīng)的JDK的版本记餐,既然比較老的版本驮樊,可能至少是JDK6 或7, 但不要認(rèn)為只要是高于指定版本的就可以編譯成功,一般不是的剥扣。對于Spring-framework 3.1.x 需要JDK6的編譯環(huán)境(經(jīng)嘗試可以用JDK7巩剖,但不能用JDK8),而3.2.x則是要JDK7的編譯環(huán)境钠怯。為了避免與運(yùn)行環(huán)境的不一致導(dǎo)致的兼容性問題佳魔,最好采用與運(yùn)行環(huán)境一致的JDK版本。
為避免繁瑣在本地安裝多個JDK并進(jìn)行環(huán)境變量的配置和切換晦炊,采用了通過docker 容器來構(gòu)建的方法鞠鲜。
# 下載jdk6-ant鏡像
docker pull nahuelolgiati/jdk6-antbuild
- 進(jìn)行構(gòu)建
首先啟動容器,把要構(gòu)建的目錄掛載到容器上
# 啟動容器断国,掛載待構(gòu)建的代碼目錄
docker run -it --name ant6 -v ${spring-framework}:/root/spring-framework nahuelolgiati/jdk6-antbuild sh
在容器中執(zhí)行構(gòu)建
cd /root/spring-framework/build-spring-framework/
ant
構(gòu)建后打包
ant jar package
# 之后在spring-framework/build-spring-framework/target/artifacts 下找到生成的發(fā)布包
ls artifacts/
spring-framework-3.1.1.RELEASE-dependencies.zip spring-framework-3.1.1.RELEASE.zip
spring-framework-3.1.1.RELEASE-with-docs.zip
遇到過的問題
- JDK的版本兼容
在用高版本JDK編譯時會提示
The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
降級到低版本(JDK6贤姆,7)就可以了
構(gòu)建時間
第一次構(gòu)建做完整時間很長,之前的版本采用ivy做依賴管理稳衬,在ant逐個的項目構(gòu)建中做下載霞捡,網(wǎng)絡(luò)(或者服務(wù)器端的瓶頸)原因,8個多小時后完成了大部分的構(gòu)建薄疚,但最后也出現(xiàn)過下載失敗而導(dǎo)致的構(gòu)建失敗碧信,多次重復(fù)執(zhí)行構(gòu)建后赊琳,才取得了成功。單元測試用例執(zhí)行失敗
在構(gòu)建中會報出單元測試失敗砰碴,比如
org.springframework.beans 中測試用例
standardReadMethodsAndOverloadedNonStandardWriteMethods
readMethodReturnsSubtypeOfWriteMethodParameter
執(zhí)行失敗
v3.1.1.RELEASE在JDK7(ryanmehta/jdk7-ant)中執(zhí)行單元測試會遇到躏筏,但在JDK6中這兩個單元測試用例是可以通過的。
因為test是依賴于jar 任務(wù)的呈枉,也就是說jar都已經(jīng)生成了趁尼。可以通過執(zhí)行ant jar package 避開單元測試猖辫。
- 重復(fù)執(zhí)行ant Jar失敗
在重復(fù)執(zhí)行ant jar時酥泞,會報如下的錯誤
/root/spring-framework/spring-build/multi-bundle/artifact.xml:60: The following error occurred while executing this line:
/root/spring-framework/spring-build/multi-bundle/common.xml:86: The following error occurred while executing this line:
/root/spring-framework/spring-build/resource/artifact.xml:35: impossible to publish artifacts for org.springframework#org.springframework.spring-parent;working@7e524d04e96d: java.io.IOException: file copy not done from /root/spring-framework/org.springframework.spring-parent/target/artifacts/ivy.xml to /root/spring-framework/org.springframework.spring-parent/../integration-repo/org.springframework/org.springframework.spring-parent/3.1.1.RELEASE/ivy-3.1.1.RELEASE.xml: destination already exists and overwrite is false
at org.apache.ivy.plugins.repository.file.FileRepository.copy(FileRepository.java:78)
at org.apache.ivy.plugins.repository.file.FileRepository.put(FileRepository.java:58)
...
可通過執(zhí)行clean-integration 或手工刪除integration-repo目錄排除
ant clean-integration jar
[前一篇]對Spring framwrok 3.1.1 修復(fù)RDF缺陷(CVE-2015-5211及CVE-2020-5421)的全過程