【轉】JDK1.6升級JDK1.8遇到的一些問題,參考


最近在做了一個將JDK1.6升級到JDK1.8的一個task,這里跟大家分享一下我們在做這個task過程中遇到的各種問題。

 

首先描述一下我們在JDK1.6中所使用的各種組建,產品原來的框架選擇的是Spring3.x,同時使用了HttpClient4.x,還有我們構建環境使用的是gradle 1.9。因為我們只是嘗試升級,所以要保證build.gradle在JDK 1.6 和1.8下都可以運行。所以決定在運行使加入toggle -Pjava8標記是運行在1.8環境下,沒有則表示運行在1.6環境下(hasProperty("java8"))。

 

在JDK1.8環境下需要升級以下組建,

 

(1)升級Spring3.x --> Spring 4.x  (**之后查閱 Spring官網資料 發現Spring4.x的發布就是為了支持JDK1.8,不過其同時修正了Spring3.2.3,使其也可以在JDK1.8下運行。)

 

(2)升級ASM3.x--> 5.x(**查閱 ASM官網發布日志 發現ASM自2013年10月發布5.0-BETA版為了支持JDK1.8)

 

升級完這些之后,發現出現了一個編譯錯誤,Spring org.springframework.cache.Cache添加了兩個抽象方法(get和putIfAbsent),因為這兩個方法在之前的系統中沒有使用過,所以決定實現這兩個方法,不過拋出UnsupportException。可是為了保證可以在JDK1.6下可以編譯通過所以注釋了@override標簽。

 

編譯通過后,嘗試運行Unit test(gradle test, urlTest, inTest)發現字節碼錯誤,搜索資料發現JDK1.8中有幾個小版本存在字節碼Verify的Bug,所以在運行Unit test時加入 JVM參數 -noverify,取消字節碼驗證。

 

再次運行Unit test,又出現了一個Spring Bean的注入錯誤。原來,項目中引入了google的一些jar文件,所以在Spring注入的時候選擇了XML配置(配置需要依賴google jar文件中的類)和@autowire兩種注入方式。

 

搜索資料后發現,在Spring3.x和4.x中@autowire按照如下方式查找bean,

 

1)首先按照Type在container中查找,如果只有一個那么就按照type注入

 

2)如果有多個實例,就按照name再次過濾,如果按名字可以匹配,那么就按照name注入

 

3)如果按照名字或者類型都匹配不到,那么就拋出異常。

 

按照這樣的解釋,我們的程序是可以正常執行的,這一點讓我們百思不得其解,最后我們按照加入了@Qualifier標簽,雖然解決了這個問題,可是我們直到現在還沒有想到到底是因為什么。

 

在解決了這些問題之后我們的所有測試就可以正常運行了。

 

我們暫時可以嘗試在Staging服務器上試運行了。


免責聲明!

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



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